【发布时间】:2015-09-13 04:03:52
【问题描述】:
这个想法来自于一个实际问题Replacing multiple new lines in a file with just one的讨论。使用在 Windows 8.1 机器上运行的 cygwin 终端时出现问题。
由于行尾终止符会有所不同,例如\n、\r 或\r\n,是否有必要编写一个“便携式”if(c=='\n') 以使其在 Linux、Windows 上运行良好和 OS X?或者,最佳实践只是用命令/工具转换文件?
#include <stdio.h>
int main ()
{
FILE * pFile;
int c;
int n = 0;
pFile=fopen ("myfile.txt","r");
if (pFile==NULL) perror ("Error opening file");
else
{
do {
c = fgetc (pFile);
if (c == '\n') n++; // will it work fine under different platform?
} while (c != EOF);
fclose (pFile);
printf ("The file contains %d lines.\n",n);
}
return 0;
}
更新1:
CRT 总是会将行尾转换为 '\n'?
【问题讨论】:
-
CRT 将始终将行尾转换为
'\n',因此如果您将文件作为文本读取,它将自动可移植。除非您想从任何平台读取具有任何类型行尾的文件 -
@LưuVĩnhPhúc 谢谢。如果尝试在 Linux 下读取文件(在 windows 上创建),最好的做法是重写
if(c=='\n'),或者只是使用命令/工具转换文件? -
@LưuVĩnhPhúc 错误(一般)。如果文件/流以“ASCII 模式”打开(仅在 microsoft 平台上存在),则行尾仅在 microsoft 平台上翻译
-
@EricTsui portable 意味着相同的代码在不同平台上编译时在该平台上可以正常运行。这并不意味着您可以毫无问题地处理来自其他平台的文件。因此,如果您使用 Windows 中的文件,则需要手动处理它们。
c=='\n'不起作用,因为 Linux CRT 不知道 Windows 或任何其他系统的行尾并且不会转换它们。先转换文件还是签入代码取决于你 -
作为用户,当读取文本文件的程序将 ether
cr/lf或 plainlf视为行结尾时,我几乎总是很感激。写入文本文件时,应使用默认的系统行结尾(写入同一文件或有特定选项覆盖提供和使用的默认值时除外)。