c-奇怪的fgets()行为
我编写的以下代码应该是打开一个作为输入的文件,对其进行写入和读取c-奇怪的fgets()行为,c,file,C,File,我编写的以下代码应该是打开一个作为输入的文件,对其进行写入和读取 fopen()工作正常,我可以访问该文件 fprintf()也按预期工作 但是对于fgets,如果我使用如图所示的if命令,则条件为true, 如果我没有得到输入[0]是'\n'字符,而输入[1]是'h',循环运行时不会停止,因为fgets()会一次又一次地读取第一个字符 此外,fgets()似乎没有前进,并已将所有文件读取到输入中-我可以按预期打印输入[3]并获取“l”,尽管fgets()被命令只读取2个字符 int mai
- fopen()工作正常,我可以访问该文件
- fprintf()也按预期工作
int main(int argc, char *argv[])
{
FILE* read = NULL;
read = fopen(name, "a+");
char* input = "";
fprintf(read, "hello world\n");
fprintf(read, "hello world\n");
assert(ferror(read) == 0);
while(!feof(read))
{
if(fgets(input, 2, read)==NULL)
return 0;
printf("%c\n", input[1]);
}
return 0;
}
printf(“%c\n”,输入[1])代码>将始终打印nul char
手册页是您的朋友
fgets()从流中读取的字符数最多比大小字符少一个,并将它们存储到s指向的缓冲区中。EOF或换行符后,读取停止。如果新行被读取,它将被存储到缓冲区中。终止空字节(aq\0aq)存储在缓冲区中最后一个字符之后
这使得input
指向一个字符串常量,特别是一个空字符串
if(fgets(input, 2, read)==NULL)
这将尝试修改输入
指向的内容。由于input
指向字符串常量,因此会尝试修改字符串常量。但是,根据定义,你不能修改一个常量——这就是为什么它是常量。char*input=“”代码>。这使得input
指向字符串文本。无法修改字符串文字。因此,您的程序具有未定义的行为。您需要为输入分配一个内存缓冲区。此外,如果您想读回刚刚编写的内容,则在执行fprintf
之后,需要回放文件指针。最后,请看。
if(fgets(input, 2, read)==NULL)