2011-02-02 37 views
0

F打開和FCLOSE都在我的源文件包函數打開文件時錯誤檢查。當我運行我的程序時,它說有一個Fopen錯誤。我在文件打開時看不到任何錯誤的原因。我怎樣才能從打開文件中找到錯誤?

很抱歉的長碼。

#include <stdio.h> 
#include <ctype.h> 
#include <stdlib.h> 
#include <string.h> 
#include "perry.h" 

int main(void) 
{ 
    void copyStrings(char *infile, char *outfile, char ch); 
    void compareFiles(char *infile, char *outfile); 

    char inputfile[80]; 
    char outputfile[80]; 
    char ch; 

    printf("Enter input filename: "); 
    scanf("%s", inputfile); 
    printf("Enter output filename: "); 
    scanf("%s", outputfile); 
    printf("Enter a character: "); 
    scanf(" %c", &ch); 

    if(!isalpha(ch)) 
    { 
     printf("Did not enter a letter!"); 
     exit(1); 
    } 

    copyStrings(inputfile, outputfile, ch); 
    compareFiles(inputfile, outputfile); 

    return 0; 
} 

void copyStrings(char *infile, char *outfile, char ch) 
{ 
    int count; 
    char *ptr; 
    char *line; 
    char linePart[80]; 
    FILE *fin; 
    FILE *fout; 

    fin = Fopen(infile, "r"); 
    fout = Fopen(outfile, "w"); 

    while(fgets(line, 80, fin) != NULL) 
    { 
     for(ptr=line;ptr<line+strlen(line);ptr++) 
     {  
       if(*ptr == ch) 
         count ++; 
     } 
     if(count < 2) 
      fputs(line, fout); 
     else 
     { 
      memset(linePart, '\0', strlen(line)+1); 
      line = strchr(line, ch); 
      strncpy(linePart, line, strchr(line+1, ch) - line + 1); 
      fputs(linePart, fout); 
      fprintf(fout, "\n"); 
     } 
    } 

    Fclose(fout); 
    Fclose(fin); 

    return; 
} 

void compareFiles(char *infile, char *outfile) 
{ 
    int count = 0; 
    char inputString[80]; 
    char outputString[80]; 
    FILE *fin; 
    FILE *fout; 

    fin = Fopen(infile, "r"); 
    fout = Fopen(outfile, "r"); 

    while(fgets(inputString, 80, fin) != NULL) 
    { 
     count += 1; 
     if(strcmp(inputString, fgets(outputString, 80, fout)) == 0) 
     { 
      printf("Strings are equal at line %d\n\nBoth strings look like this: %s", 
      count, inputString); 
     } 
    } 
    Fclose(fout); 
    Fclose(fin); 

    return; 
} 
+2

看到了`Fopen`實際的代碼將很長的路要走爲回答這個問題。 – shoosh 2011-02-02 01:03:03

回答

1

你應該把一個perrorFopenFclose,以便它描述爲何被包裝的函數失敗。

fopen

Linux手冊頁指出它可能會失敗原因如下:

  • 提供的模式是無效

  • 如果malloc功能,稱爲內fopen失敗

  • 如果openfopen內使用的功能失敗。

+0

對。如果`fopen()`返回NULL,則執行`perror(「fopen」);`。 – caf 2011-02-02 02:07:40

1

你當然應該嘗試PERROR東西在前面的評論中指出,但看你的代碼後,我認爲你應該檢查那些文件被再次打開模式。

要在「R」模式下打開一個文件時,必須在現有的第一否則的fopen會返回一個錯誤。你沒有指出你在fopen失敗的地方,但最好檢查所有文件操作的返回值以及內存分配操作。

以下是檢查返回值(跳過額外的可變部分)有點俗氣方式:

FILE * FP = NULL; ((fp = fopen(test.txt,「r」))== NULL) printf(「fopen failed」); 返回FALSE // - 1或任何你想返回的失敗案例; }

其他 {// 代碼 }

0

您可以使用perror()如果你不介意它的格式的限制範圍內工作,或者你可以做相當於:

fprintf(stderr, "Failed to open %s (%d: %s)\n", filename, errno, strerror(errno)); 

你應該永遠只能看errno功能報告故障後。它也可以在成功的函數之後設置。例如,在Solaris上,如果輸出不是「TTY」,你會經常發現在ENOTTY一個errno成功打印操作之後 - 因爲它檢查輸出文件描述符是否是一個TTY,實際上它不是。但功能成功了。

如果在你的代碼中的任何多個函數調用超過該行的我發現,最好是在早期保存errno - 因爲它得到與其他功能(一個全局變量的許多缺點之一)篡改。所以,我經常寫:

{ 
    int errnum = errno; 
    ...any other processing... 
    fprintf(stderr, "%s: failed to open %s for reading (%d: %s)\n", 
      prog_name, file_name, errnum, strerror(errnum)); 
} 

那麼,我寫的邏輯等價於;我有一個報告錯誤庫,所以我其實寫:

err_sysrem("failed to open %s for reading", file_name); 

所有的包的功能開始err_。功能err_sysrem()是一個備註(不會退出),幷包含系統錯誤信息 - errnostrerror(errno)。如果我叫err_syserr()相反,它會終止程序,並err_remark()不會從errno包括信息,也不將err_error()。我覺得這些功能所提供的簡潔是有益的。這些功能都會在消息的開頭自動包含程序名稱;您可以將其配置爲包含時間戳或PID或其他信息。您在main()中使用err_setarg0(argv[0]);來設置程序名稱;當然,你可以隨時改變它。