【问题标题】:How to auto append newline at the end of a file如何在文件末尾自动添加换行符
【发布时间】:2014-07-10 09:21:15
【问题描述】:

我是新手,并且有一个 C - Linux 程序,它可以读取许多变量行,如下所示:

12 34 56 78
3 4 7 900
...
%d %d %d %d
...
1 2 3 4

目前我写的函数是这样的:

void Import(const char* path_of_file)
{
  FILE *cfile = fopen(path_of_file, "r");
  int lines = 0;
  //I copied it from another question
  while (EOF != (fscanf(cfile,"%*[^/n]"), fscanf(cfile, "%*c"))) ++lines;
  fclose(cfile);
  cfile = fopen(path_of_file, "w");
  ...
  for( i=0; i<n; i++)
  {
    ...
    fscanf(cfile, "%d %d %d %d", &a, &b, &c, &d);
    ...
  }
  ...
  //Of course it will return something, but it shouldn't matter here
  fclose(cfile);
}

但可能是因为文本文件是在 Windows 中创建的或其他什么,它并不总是以换行符结尾,所以我的程序经常错过最后一行。

如果文件不存在,是否有自动在文件末尾附加换行符?或者更好的是,有没有办法在没有换行符的情况下读取最后一行?基于上述的一个示例函数会非常好。

【问题讨论】:

  • 如果您希望在 linux 系统上使用 Windows 格式的文件,您可能需要尝试使用命令行工具 dos2unix 来修复换行符
  • 如果要读取行,请使用 fgets 而不是 scanf。如果您必须担心文件末尾有换行符或没有换行符,那么您可能做错了。
  • 使用fgets 读取一行,使用sscanf 解析它。更容易处理。
  • @user3288829 其实是赋值,所以工具没办法,必须在程序内运行。
  • 计算行数的方式有点奇怪(为什么是/n?)。但如果它在大多数情况下都有效,您可以通过迭代 n+1 次来高估这个数字,如果 scanf 无法读取任何内容,则退出循环。

标签: c linux gcc scanf


【解决方案1】:

谢谢帕维尔,我从未阅读过该帖子中的其他答案,我的错是只阅读了已接受的答案。看完这些帖子后,我选择使用这段代码来计算行数,可以避免上面的问题:

int n = 0;
int pc = EOF;
int c;
while ((c = getc(cfile)) != EOF) {
  if (c == '\n')
    ++n;
  pc = c;
}
if (pc != EOF && pc != '\n')
  ++n;

对不起我的愚蠢。

【讨论】:

    猜你喜欢
    • 2014-05-28
    • 1970-01-01
    • 2012-10-02
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多