1

我有一部分 C 代码如下,它是在 linux gcc 环境中编译的。

在我的项目中,当读取从不同操作系统创建的 txt 文件时,我必须处理所有 CRLF、CR 和 LF。

我不确定 fscanf() 是否会自动处理所有情况。

有没有其他方法可以处理所有情况?

while (fscanf(fp, "%d", &data) != EOF) 
{
    printf("%d\n", data);
}
4

1 回答 1

1

在读取从不同操作系统创建的 txt 文件时处理所有 CRLF、CR 和 LF。

我不确定是否会fscanf()自动处理所有情况。

的某些用法fscanf()会像 一样正常工作fscanf(fp, "%d", &data),但不是全部。

一个简单的替代方法是用您自己的方式读取输入my_fgets(),然后调用sscanf().

char my_fgets(char *s, size_t sz, FILE *fp) {
  if (sz < 1) {
    return NULL;
  }
  char *org = s;
  bool no_input = true;
  int ch = 0;

  while (--sz > 0 && (ch = fgetc(fp)) != EOF) { 
    no_input = false; 
    if (ch == '\r') {
      int ch2 = fgetc(fp);
      if (ch2 != '\n') ungetc(ch2, fp);
      break;
    }
    if (ch == '\n') {
      break;
    }
    *s++ = ch;
  }
  *s = '\0';
  if ((ch == EOF) && (no_input || !feof(fp))) return NULL;
  return org;
} 

my_fgets(buffer, sizeof buffer, fp);
sscanf(buffer, ...);

如果文件以二进制或文本模式打开,这将处理大多数情况。


依赖文本模式和系统相关的行尾翻译是不够的,因为代码需要处理至少 3 种情况,其中一些可能与预期的系统相关的行尾不对应。

于 2019-03-15T15:52:44.213 回答