【发布时间】:2017-12-11 20:44:11
【问题描述】:
我必须编写一个功能类似于 dos2unix 的 C 程序。将所有 CR LF 替换为仅 LF(DOS 格式到 Unix 格式)。
所以这是我的方法。每次我读到一行,我通过查找\0来搜索数据的结尾,然后检查以下是否为\r\n。
如果是,则替换为 \nonly。但它似乎不起作用,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
}
【问题讨论】:
-
您需要使用
strcmp(或strncmp)来比较字符串。==比较指针值。 -
请阅读this question。
-
这不是比较字符串,而是以文本模式打开文件;它不是标记的问题/答案的副本。
-
除了其他人指出的所有错误之外,您可能需要以二进制模式打开这两个文件(
"rb"、"wb")才能首先看到 CRLF,然后防止 C 库在输出时将\n转换回\r\n;您没有检查任何错误;您用\n替换\r\n的逻辑不正确;而且你没有正确处理长线; -
如果您要转换换行符,则没有充分的理由使用
fgets。该功能是面向行的,如果您担心行尾,那么根据定义,您几乎不信任您的输入。而fgets太过分了。使用fgetc或getc一次读取文件一个字符。您只需要跟踪少量的状态。 (有两种状态:一种是之前读取的字符是\r,一种不是)
标签: c newline carriage-return