繁体   English   中英

使用fread从C中的文件读取

[英]Reading from file in C using fread

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

问题是您使用w+模式打开文件。 有两种可能性:

  • 如果文件不存在,它将被创建为空。 立即从中读取将给出文件结尾,导致fread()返回0。
  • 如果文件确实存在,它将被截断,即更改为空文件。 立即从中读取将给出文件结尾,导致fread()返回0。

如果只想读取文件(按照您的示例),请在模式r打开它。 如果您想在不破坏其现有内容的情况下进行读写,请使用模式r+

无论选择哪种模式,请始终检查fopen()返回非null,如果返回null则显示错误(这不是问题的原因,而是最佳实践)。

从手册 w+标志:

开放供阅读和写作。 如果该文件不存在,则创建该文件,否则该文件将被截断。

您可能正在尝试打开您提供的路径中不存在的文件,或者如@WhozCraig在注释中建议的那样为read-only 这意味着正在创建一个新文件,一个空文件! 因此,您看到0字节的读取。

综上所述, fopen失败,在这种情况下,您需要检查返回值是否等于-1
要了解什么是错误,你可以检查errno ,因为它被设置为显示错误。

如果只打算读取,请使用r标志而不是w+打开文件

问题在于以下代码行:

fp = fopen("test.txt","w+") 

"w+"模式下,清除文件的先前内容,并且仅在不写入任何内容的情况下读取文件时,文件将为空。 因此,它正在打印"Read could not happen"因为您正在尝试读取一个空文件。

如果您愿意读取然后写入文件,我建议您使用"r+"模式。 否则, r模式足以简单读取文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM