【发布时间】:2020-02-01 06:39:39
【问题描述】:
如果文件是某些字节长,我的缓冲区由“fread()”创建的 csv 文件(整体)打印出难以理解的额外字符。我遵循读取文件的标准方法(fseek()、ftell() 和 fread())。
当我的文件大小大约在 104 到 113 字节之间时会出现此问题。
1.为什么会在一定范围内发生?
2.解决方案?
代码:
int getfilesize(char *fname)
{
FILE *fp = fopen(fname, "r");
fseek(fp, 0, SEEK_END);
int size = ftell(fp);
fclose(fp);
return size;
}
int main()
{
int file_size=getfilesize("sample1.csv");
printf("\nsize of file:%d",file_size);
char* buf=(malloc(file_size+1));
FILE* fp=fopen("sample1.csv","r");
fread(buf,file_size,1,fp);
fclose(fp);
printf("\nstring is: \n%s\n",buf);
return 0;
}
错误的文件(在该文件的下一行打印了一个“4”):
Sample1.csv(我的系统上 108 个字节):
0x1001,0,0,0-100
0x1017,5,1,10:-20:-30:30:40:-90:-23
0x1011,4,1,5:10:20
0x1028,2,0,0-2,1
0x1021,1,1,1:2:4:8
无错误文件:
Sample1.csv(在我的系统上为 120 字节):
0x1001,0,0,0-100
0x1017,5,1,10:-20:-30:30:40:-90:-23
0x1011,4,1,5:10:20
0x1028,2,0,0-2,1
0x1021,1,1,1:2:4:8:10:12:13:14
【问题讨论】:
-
我没有看到您描述的错误打印的“4”。我是不是误会了什么?
-
尝试在
printf之前添加buf[file_size]='\0'。也就是说,您需要确保buf包含一个字符串。从文本文件中读取的数据不会自动成为有效的 C 字符串,malloc不会将内存显式初始化为零。 -
我认为@kaylum 是对的;似乎您在有效数据之后看到了额外的随机字节,因为该字符串未正确以空值结尾。按照他们的建议将最后一个字节设置为零将解决此问题。
-
谢谢,显然添加一个 '\0' 字符确实解决了这个问题。我假设我们声明了“f_size+1”的“buf”,以便自动插入空字符,这也是常规字符串声明的情况。我想知道为什么需要干预。但仍然再次感谢。
-
正如我所说,
malloc分配内存但不向其写入任何内容。所以内存的内容包含未知值。没有任何“自动插入”,因为内存可以用于任何数据类型,而不仅仅是字符串。