我是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;
}
答案 0 :(得分:0)
关于未定义行为的快速说明:如果我们建议它崩溃,那么我们会将其定义为崩溃......我们无法做到这一点,因为它&#39 ; s 未定义。我们可以说的是,未定义的行为是不可移植的,可能是不可取的,当然也应该避免。
根据the fopen
manual,打开文件有六种标准模式,"rt"
不是其中之一。
我引用了列出这六种标准模式的部分。请注意重点(我的),如果您选择其中一种标准模式以外的行为,则表明行为未定义。
mode参数指向一个字符串。如果字符串是以下之一,则应以指示的模式打开文件。 否则,行为未定义。
r
或rb
Open file for reading.
w
或wb
Truncate to zero length or create file for writing.
a
或ab
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
。但是,有时候,您会获得否定 int
值EOF
。这是int
值,而不是字符值。 唯一的字符值fgetc
返回为正。
因此,您还应该对fgetc
执行错误处理,如下所示:
int c = getchar();
if (c == EOF) {
return 0;
}