我必须编写一个有点像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
}
答案 0 :(得分:3)
你有很多错误:
in.txt
模式而不是"rb"
模式打开"r"
,才能首先查看CRLF行结尾。out.txt
模式而不是"wb"
模式打开"w"
,以防止C库撤消您的工作。 ==
进行比较。你可以将一个字符串的一个字符与一个字符字面值与==
进行比较,但这不是你正在做的事情,而是它仅适用于单个字符; CRLF序列是两个字符。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)的终结者,并没有其他任何明智的做法。
c
是int
而不是char
非常重要,因此它可以保存EOF以及所有可能的字符。