在C中用LF替换CR LF

时间:2017-12-11 20:44:12

标签: c newline carriage-return

我必须编写一个有点像dos2unix的C程序。将CR LF替换为仅LF(DOS格式为Unix格式)。 所以这是我的方法。每当我读一行时,我会通过查找\0来搜索数据的结尾,然后检查以下是\r\n。 如果是,则仅替换为\n。但似乎行不通,行CRLF here从未打印过一次。

char data[255]; // save the data from in.txt
char *checker;
pf = fopen("in.txt", "r");
pf2 = fopen("out.txt", "w");
while (feof(pf) == 0)
{
    fgets(data, 255, pf);       // Read input data
    checker = data;
    while (checker != "\0") // Search for a new line
    {
        if (checker == "\r\n") // Check if this is CR LF
        {
            printf("CRLF here");
            checker = "\n";   // replace with LF
        }
        checker++;
    }
    fputs(data, pf2);       // Write to output data
}

1 个答案:

答案 0 :(得分:3)

你有很多错误:

  • 您可能需要以in.txt模式而不是"rb"模式打开"r",才能首先查看CRLF行结尾。
  • 您可能需要以out.txt模式而不是"wb"模式打开"w",以防止C库撤消您的工作。
  • 您无法将字符串文字与==进行比较。你可以将一个字符串的一个字符与一个字符字面值与==进行比较,但这不是你正在做的事情,而是它仅适用于单个字符; CRLF序列是两个字符。
  • 您不能通过简单的赋值在可变C字符串中替换具有单字符序列的双字符序列。您需要使用memmove将替换后的所有字符移位。
  • 你没有正确处理很长的行。
  • 您不检查fopen是否成功,或是否有任何其他I / O错误。
  • while (!feof (fp)) is always wrong

编写此程序的更好方法是使用字符的主循环,类似

  int c;
  while ((c = getc(ifp)) != EOF) {
    if (c == '\r') {
      putc('\n', ofp);
      c = getc(ifp);
      if (c == EOF) break;
      if (c == '\n') continue;
    }
    putc(c, ofp);
  }

这会将\r\n和裸\r转换为\n,因为现在裸\r非常罕见,但 用作行一些历史操作系统(特别是经典的MacOS)的终结者,并没有其他任何明智的做法。

cint而不是char非常重要,因此它可以保存EOF以及所有可能的字符。