从特定字节的文件中读取的额外奇怪字符

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);

【讨论】:

以上是关于从特定字节的文件中读取的额外奇怪字符的主要内容,如果未能解决你的问题,请参考以下文章

C++ 将字符串写入文件 = 额外字节

使用校验和将字节数组转换为字符串。在 python 中重新迭代时获取额外的空字节

将PNG图像读取为NSData,出现一些额外的字节

从命名管道、C 程序(编写器)和 Python(读取器)获取额外数据

将字符串打印到文件,为啥需要额外的位?

为客户端上的每个文件添加额外的文件属性,并从服务器上的请求对象中读取所有文件属性