【问题标题】:fprintf prints a new line at the beginning of the filefprintf 在文件开头打印一个新行
【发布时间】:2012-01-22 18:50:53
【问题描述】:

我正在使用 fprintf 函数打印到新文件

我用下面的命令写了多次:

fprintf(fp, "%-25s %d %.2f %d",temp->data.name, temp->data.day, temp->data.temp, temp->data.speed);

问题是有时文件的第一个字符会多出一个新行。 这可能是一些缓冲区的遗留物吗,我真的不知道......

typedef struct Data {
    char name[26];
    int day;
    int speed;
    float temp;
} Data ;

@spatz 你是对的,我对字符串格式有点陌生,我被告知要为 fscanf 制作一个,我预计数据位之间的空间量不确定,这就是我想出了,我很确定它是问题的根源:

check=fscanf(fp1, "%20c%*[^0-9]%d%*[^0-9]%f%*[^0-9]%d%*[^\n]%*c", name, &day, &temp, &speed);

只有第一行被正常读取,之后的所有内容都读取上一行的新行。

有人可以告诉我写这个东西的正确方法吗?

【问题讨论】:

  • 显示temp->data类型的定义。您是否在编译时出现所有警告?
  • fp是怎么打开的?难道仅仅是name 以换行符开头?
  • 请发布完整代码,否则所有解决您问题的尝试都将纯属猜测。 IE。您如何打开文件,该文件之前是否存在,是否在另一个程序中打开,您的 data 结构中的实际数据是什么?

标签: c file-io printf


【解决方案1】:

与其一遍又一遍地调用 fscanf() 并希望换行符与您想要的匹配,不如使用 fgets() 一次获取一行,使用 fscanf() 解析它,并对一行进行错误处理-逐行的基础。这将不太容易出错,而且听起来它会毫不费力地解决您的问题。

【讨论】:

    【解决方案2】:

    您的问题是name 以换行符开头,而该换行符在文件中结束。

    为了正确解析文件,我必须知道它的格式,但现在我假设它是<string> <int> <int> <float>,其中每个元素之间的空格数可能会有所不同。

    我要开始的格式字符串只是"%s%d%d%f",然后让fscanf() 处理空格。使用这种格式字符串,我能够正确解析像

    这样的行
    foo     3   4 7  
    

    如果这不能满足您的要求,请随时详细说明您正在解析的文件的格式,我会尝试提出解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 1970-01-01
      • 2018-10-22
      • 1970-01-01
      相关资源
      最近更新 更多