Som*_*cat 1 c newline carriage-return
我必须编写一个功能类似于 dos2unix 的 C 程序。将全部替换CR LF为LF(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)
你有一大堆错误:
in.txt的"rb"模式,而不是"r"模式,看到摆在首位的CRLF行结束。out.txt的"wb"模式,而不是"w"模式,以防止C库从解开自己的工作。==. 您可以使用将字符串的一个字符与字符文字进行比较==,但这不是您要做的,它仅适用于单个字符;一个 CRLF 序列是两个字符。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 以及所有可能的字符。