2011-06-13 60 views
1

我有一個程序正在創建多個文件。每個正在創建的文件都有一個函數。在每個函數中,都是完全相同的代碼來創建文件名,打開/創建文件進行寫入,設置其權限並在最後關閉文件。我決定創建一個函數來打開文件並關閉文件,這樣我就可以調用它而不是每次使用相同的代碼。以前的代碼在每個函數中看起來如下所示:fopen上的Seg錯誤/ fclose

void WriteFile1(char *name) { 
    FILE *file; 
    char *filename; //This is being malloc'ed because it initially consisted of multiple strings 

    if (!(filename = malloc(sizeof(char *) * (strlen(name) + 1)))) MallocError(); 
    if (!(file = fopen(filename, "w"))) { 
     fprintf(stderr, "Unable to open %s. Exiting \n", filename); 
     exit(1); 
    } 
    fchmod(fileno(file), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH); 

    //a bunch of fprintf statements here 

    if (fclose(file)) { 
     fprintf(stderr, "Error closing %s. Exiting...\n", filename); 
     exit(1); 
    } 
} 

這很好用。我沒有問題。現在看起來如下:

void WriteFile1() { 
FILE *file; 

OpenFile(file, "filename.asdf"); 
//fprintf statements 
CloseFile(file, "filename.asdf"); 
} 

void OpenFile(FILE *file, char *name) { 
    if (!(file = fopen(name, "w"))) { 
     fprintf(stderr, "Unable to open %s. Exiting... \n", name); 
     exit(1); 
    } 
    fchmod(fileno(file), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH); 
} 
void CloseFile(FILE *file, char *name) { 
    if (fclose(file)) { 
     fprintf(stderr, "Error closing %s. Exiting...\n", name); 
     exit(1); 
    } 
} 

它,只要我得到第一個fprintf中聲明WriteFile1()賽格故障。我用FILE變量做錯了什麼嗎?它似乎應該像以前一樣工作。唯一的區別是文件名字符串的malloc,我將其作爲名稱傳入,並將實際值用引號引起來。

謝謝

+2

我看不出你原來的代碼可能如何工作,因爲你從來沒有真正設置文件名你malloc。 – 2011-06-13 15:19:45

+0

如果WriteFile1()中有fprintf語句,請您向我們展示代碼? – razlebe 2011-06-13 15:22:05

+0

如果fopen失敗,你*必須*包含系統錯誤(例如,來自perror()或strerror())以產生有用的錯誤消息。 「無法打開文件。正在退出...」不是有用的錯誤消息。 – 2011-06-14 04:06:47

回答

2

這段代碼是錯誤的:

void OpenFile(FILE *file, char *name) { 
    if (!(file = fopen(name, "w"))) { 

這裏你只是分配給本地file變量。 你必須返回file,使您的WriteFile1()函數可以與FILE *

void WriteFile1() { 
FILE *file; 

file = OpenFile("filename.asdf"); 
//fprintf statements 
CloseFile(file, "filename.asdf"); 
} 

FILE * OpenFile(char *name) { 
    FILE * file; 
    if (!(file = fopen(name, "w"))) { 
     fprintf(stderr, "Unable to open %s. Exiting... \n", name); 
     exit(1); 
    } 
    fchmod(fileno(file), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH); 
    return file; 
} 
+0

Doh!謝謝 - 它總是很明顯的事情。 – Alex 2011-06-13 15:28:52

1

你open函數應該是這樣的:

FILE * OpenFile(char *name) { 
    FILE * file; 
    if (!(file = fopen(name, "w"))) { 
     fprintf(stderr, "Unable to open %s. Exiting... \n", name); 
     exit(1); 
    } 
    fchmod(fileno(file), S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH); 
    return file; 
} 

在您的版本中,FILE *是有效的局部變量(因爲它是一個參數)的功能。在功能中改變它並不會改變它在外面的世界。

在設計返回指針的函數(或其他任何事情)時,總是傾向於通過return語句返回指針,而不是通過參數列表嘗試執行。

1

工作時,此:

filename = malloc(sizeof(char *) * (strlen(name) + 1)) 

應該是:

filename = strdup(name); 

如果你有的話,否則類似:

if((filename = malloc(strlen(name) + 1)) != NULL) 
{ 
    strcpy(filename, name); 
    ... 
} 

特別注意,每個字符只是一個char,而不是一個char *。由於sizeof (char) == 1總是如此,所以根本沒有必要參與。