C程序无法从文件中读取

时间:2015-10-17 19:58:43

标签: c file file-handling

我是C和文件处理的新手,我正在尝试打印文件的内容。如果重要的话,我正在使用Code :: Blocks。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(void)
{
    char c;
    FILE *f;
    f = fopen("filename.txt", "rt");

    while((c=fgetc(f))!=EOF){
        printf("%c", c);
    }
    fclose(f);
    return 0;
}

1 个答案:

答案 0 :(得分:0)

关于未定义行为的快速说明:如果我们建议它崩溃,那么我们会将其定义为崩溃......我们无法做到这一点,因为它&#39 ; s 未定义。我们可以说的是,未定义的行为是不可移植的,可能是不可取的,当然也应该避免。

根据the fopen manual,打开文件有六种标准模式,"rt"不是其中之一。

我引用了列出这六种标准模式的部分。请注意重点(我的),如果您选择其中一种标准模式以外的行为,则表明行为未定义。

  

mode参数指向一个字符串。如果字符串是以下之一,则应以指示的模式打开文件。 否则,行为未定义。

     

rrb

Open file for reading.
     

wwb

Truncate to zero length or create file for writing.
     

aab

Append; open or create file for writing at end-of-file.
     

r+rb+r+b

Open file for update (reading and writing).
     

w+wb+w+b

Truncate to zero length or create file for update.
     

a+ab+a+b

Append; open or create file for update, writing at end-of-file. 

好的,考虑到这一点,您可能打算使用"r"模式。在fopen之后,您需要确保文件成功打开,正如其他人在评论中提到的那样。可能会发生许多错误,因为我确信您可以推断出......您的错误处理应该看起来像这样:

f = fopen("filename.txt", "r");
if (f == NULL) {
    puts("Error opening filename.txt");
    return EXIT_FAILURE;
}

其他人也评论了fgetc的返回类型;它没有返回 char 。它会返回 int ,这是有充分理由的。大多数情况下,它会成功返回(通常)256个字符值中的一个,因为 unsigned char值转换为int。但是,有时候,您会获得否定 intEOF。这是int值,而不是字符值。 唯一的字符值fgetc返回为正。

因此,您还应该对fgetc执行错误处理,如下所示:

int c = getchar();
if (c == EOF) {
    return 0;
}