读取txt文件时处理CRLF,CR和LF

时间:2019-03-15 15:23:46

标签: c newline lf

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

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

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

还有其他方法可以处理所有案件吗?

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

1 个答案:

答案 0 :(得分: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种情况,其中有些可能与预期的与系统有关的行尾不对应。