使用fread从C中读取文件

时间:2017-02-28 09:57:12

标签: c

我正在学习如何从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

3 个答案:

答案 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模式足以简单地读取文件。