如何处理任何文本文件中的换行符'\ n'与linux换行符\ r \ n字符?

时间:2011-07-14 09:42:44

标签: c newline fgets

我有一个C代码,它使用

从文本模式打开的文件中一次读取1行
fgets(buf,200,fin); 

fgets()从中读取行的输入文件是程序的命令行参数。

现在fgets将包含在字符串中的换行符复制到buf。

在某处我检查代码中的行

length = strlen(buf);

对于某些输入文件,我猜是在* nix环境中编辑的换行符只是'\n'

但是对于其他一些测试用例输入文件(我猜是在Windows环境下编辑/创建)有2个字符表示换行符 - '\r''\n'

我想删除换行符,并希望将'\ 0'作为字符串终止符。所以我要么做 -

    if(len == (N+1))
    {
    if(buf[length-1] == '\n')
     {
         buf[length-2] = '\0'; //for a `\r\n` newline
     }
    } 

if(len == (N))
{
 if(buf[length-1] == '\n')
 {
     buf[length-1] = '\0'; //for a `\n` newline
 }
} 

由于文本文件作为命令行参数传递给程序,因此我无法控制它是如何编辑/编写的,因此无法使用某种工具对其进行过滤以使换行符保持一致。

我该如何处理这种情况?

标准C库(没有扩展名)中是否有任何fgets等效函数可以处理这些不一致的换行符并返回没有它们的字符串?

3 个答案:

答案 0 :(得分:2)

我想同时更新length

if (buf[length - 1] == '\n') buf[--length] = 0;
if (buf[length - 1] == '\r') buf[--length] = 0;

或删除所有尾随空格

/* remember to #include <ctype.h> */
while ((length > 0) && isspace((unsigned char)buf[length - 1])) {
    buf[--length] = 0;
}

答案 1 :(得分:1)

我认为你最好(也是最简单)的选择就是编写自己的strlen函数:

size_t zstrlen(char *line)
{
  char *s = line;

  while (*s && *s != '\r' && s != '\n) s++;
  *s = '\0';
  return (s - line);
}

现在,要计算字符串的长度(不包括换行符)并将其删除(/它们),您只需执行以下操作:

fgets(buf,200,fin);
length = zstrlen(buf);

适用于Unix风格('\ n'),Windows风格('\ r \ n')和旧Mac风格('\ r')。

请注意,strlen的执行速度更快(但非便携),您可以根据自己的需要进行调整。

希望它有所帮助,   RD:

答案 2 :(得分:0)

如果您对不同机器上的不同行结尾(\n\r\n)感到困扰,那么中和它们的一种方法是使用dos2unix命令(假设您正在工作)在Linux上,并在Windows环境中编辑文件)。该命令将用linux风格的行结尾替换所有窗口样式的行结尾。反向unix2dos也存在。您可以在C程序中调用这些实用程序(可能是system),然后像您当前那样处理该行。这样可以减轻程序的负担。