【问题标题】:fread reading past the end of filefread 读取文件末尾
【发布时间】:2017-02-25 21:34:39
【问题描述】:

我编写了一些简单的代码来读取 C 中文件的内容并将其输出到命令行,只是为了让自己熟悉 Code::Blocks。我刚刚从我编写的另一个程序中复制了这段代码(它工作得很好)。

我打开文件,malloc 足够的内存来存储文件的内容,然后将文件的内容读入那个内存。当我打印文件的内容时,最后我得到了随机的垃圾。我添加了一些调试打印语句来检查文件的长度(在 15 处出现)和我将文件内容读入的字符串的长度(在 22 处出现)。我不明白为什么我读入数据的字符串比文件长?

感谢任何帮助,代码如下。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
//open a file for editing
FILE * inputFile = fopen("hexfile.txt", "rb");

//Measure the file and allocate memory
fseek(inputFile, 0, SEEK_END);
unsigned long fileSize = ftell(inputFile);
rewind(inputFile);
char *inputData = (char*)malloc(fileSize);

//Save the contents of the file to a variable
fread(inputData, sizeof(char), fileSize, inputFile);

printf("File Size: %lu \n", fileSize);
int length = strlen(inputData);
printf("String Length = %d \n", length);

printf("Contents of file: %s", inputData);

//Close files
fclose(inputFile);
return 0;
}

【问题讨论】:

  • 您是否在从文件读取的数据末尾粘贴了一个空终止符(“\0”字符)?看起来不像。您知道 C 中的字符串必须以空终止符结尾。 strlen 将继续计数,printf 将继续打印,直到找到 '\0' 字符。
  • 您好,感谢您的回复。这也是我的第一个想法,但我用 strcat 添加了一个,它仍然在文件内容之后打印出随机垃圾。
  • @lucasRHCP 你不能用strcat()添加到一个“字符串”,如果它不是一个以空结尾的字符串...
  • fread 不会创建字符串。所以你不能使用 fread 结果的字符串函数(如 strcat 和 strlen 和 printf)。您需要通过在正确的位置放置一个 '\0' 来使其成为一个字符串。
  • 另外,您已将inputData 设置为仅足以容纳文件内容。您需要将其 malloc 比 fileSize 大 1 个字符,以便保留您要放在末尾的额外 '\0'。

标签: c file codeblocks fread


【解决方案1】:

您的程序几乎是正确的。要有一个有效的字符串,它必须是 终止于'\0'。如果您的文件没有空字节 巧合,那么你的数据在读取为字符串时没有结束。

要解决这个问题,只需在分配内存时再添加一个空间,然后设置 最后一个字节为空:

char *inputData = (char*)malloc(fileSize+1);
/* ... */
inputData[fileSize] = '\0';

【讨论】:

  • 谢谢,解决了!
猜你喜欢
  • 2021-10-16
  • 2011-09-21
  • 2013-08-02
  • 1970-01-01
  • 2011-08-07
  • 2013-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多