从特定字节的文件中读取的额外奇怪字符
Posted
技术标签:
【中文标题】从特定字节的文件中读取的额外奇怪字符【英文标题】:Extra weird characters read from a file of certain bytes 【发布时间】: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
分配内存但不向其写入任何内容。所以内存的内容包含未知值。没有任何“自动插入”,因为内存可以用于任何数据类型,而不仅仅是字符串。
【参考方案1】:
代码不能确保打印 字符串,因为 buf
不是 空字符 终止的。
调整代码使buf
是一个字符串 或有宽度限制的打印。
// printf("\nstring is: \n%s\n",buf);
printf("\nstring is: \n%.*s\n", file_size, buf);
【讨论】:
以上是关于从特定字节的文件中读取的额外奇怪字符的主要内容,如果未能解决你的问题,请参考以下文章
使用校验和将字节数组转换为字符串。在 python 中重新迭代时获取额外的空字节