【问题标题】: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 分配内存但不向其写入任何内容。所以内存的内容包含未知值。没有任何“自动插入”,因为内存可以用于任何数据类型,而不仅仅是字符串。

标签: c csv fread


【解决方案1】:

代码不能确保打印 字符串,因为 buf 不是 空字符 终止的。

调整代码使buf 是一个字符串 或有宽度限制的打印。

// printf("\nstring is: \n%s\n",buf);
printf("\nstring is: \n%.*s\n", file_size, buf);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多