我必须编写一个功能有点像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
}发布于 2017-12-11 21:04:47
你有一大堆虫子:
in.txt模式下打开"rb"模式,而不是"r"模式,以查看CRLF行的结尾。out.txt模式下打开"wb"模式,而不是"w"模式,以防止C库取消您的工作。==进行比较。您可以将字符串的一个字符与字符文字与==进行比较,但这不是您要做的,它只适用于单个字符;CRLF序列是两个字符。memmove来移动所有字符。fopen是否成功,也不检查任何其他I/O错误。编写此程序的一个更好的方法是使用一个逐字符的主循环,如下所示
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和bare \r转换为\n,因为bare \r现在非常少见,但在某些历史OSes (特别是经典的MacOS)中被用作行终止符,并且没有任何其他明智的方法。
重要的是,c应该是一个int,而不是一个char,这样它就可以保存EOF以及所有可能的字符。
https://stackoverflow.com/questions/47761108
复制相似问题