在 C 中用 LF 替换 CR LF

Som*_*cat 1 c newline carriage-return

我必须编写一个功能类似于 dos2unix 的 C 程序。将全部替换CR LFLF(DOS-Format to Unix-Format)。所以这是我的方法。每次我读一行时,我都会通过lookng for 来搜索数据的结尾\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
}
Run Code Online (Sandbox Code Playgroud)

zwo*_*wol 5

你有一大堆错误:

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

编写此程序的更好方法是使用一个逐字符运行的主循环,例如

  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);
  }
Run Code Online (Sandbox Code Playgroud)

这会将\r\n和 bare转换\r\n,因为\r现在非常罕见,但是在某些历史操作系统(特别是经典的 MacOS)上用作行终止符,并且没有任何其他明智的事情可以用它来做。

重要的是它c是一个int,而不是一个char,这样它就可以容纳 EOF 以及所有可能的字符。