2011-02-02 47 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]);来设置程序名称;当然,你可以随时改变它。