我正在学习如何从C中的文件中读取内容。我设法了解以下代码。
#include <stdio.h>
#include <stdlib.h>
void read_content(FILE *file) {
char *x = malloc(20);
// read first 20 char
int read = fread(x,sizeof(char),20,file);
if (read != 20) {
printf("Read could not happen\n");
}
else {
printf("the content read is %s",x);
}
free(x);
return;
}
int main(int argc,char *argv[]) {
FILE *fp;
fp = fopen("test.txt","w+");
read_content(fp);
fclose(fp);
return 0;
}
但由于某些原因(我无法理解),我发现read
个字节数为0
。
答案 0 :(得分:2)
问题是您使用w+
模式打开文件。有两种可能性:
fread()
返回0。fread()
返回0。如果您只想从文件中读取(根据您的示例),请在模式r
中打开它。如果要在不破坏现有内容的情况下进行读写操作,请使用模式r+
。
无论您选择何种模式,请始终检查fopen()
是否返回非null并在错误返回时打印错误(这不是您的问题的原因,但这是最佳做法)。
答案 1 :(得分:1)
来自here read-only
旗帜:
开放阅读和写作。如果是,则创建该文件 不存在,否则会被截断。
您可能正在尝试打开在您提供的路径中不存在的文件,或者{@ 1}}为@WhozCraig在评论中建议的文件。这意味着正在创建一个新文件,一个空文件!因此,您会看到0
字节读取。
总而言之,fopen
失败,在这种情况下,如果返回值等于-1
,则需要检查返回值。
要查找错误是什么,可以检查设置为errno
的错误
表明错误。
如果您只想阅读,请使用r
标志而不是w+
打开文件
答案 2 :(得分:1)
问题在于这行代码:
fp = fopen("test.txt","w+")
"w+"
模式,清除文件的先前内容,当您只是在不写任何内容的情况下读取文件时文件将为空。因此,它正在打印"Read could not happen"
,因为您正在尝试读取空文件。
如果您愿意阅读然后写入文件,我建议您使用"r+"
模式。否则,r
模式足以简单地读取文件。