多行结束删除

时间:2014-02-09 18:27:21

标签: c

我正在编写一个程序,它将使用以下语法读取一个字典:

    john
    philips
    dudule
    henry

因此我写了这个程序:

#define SIZEWORD 10

int main (int argc, char **argv)
{
   /*get dictionarry words*/
   FILE * pFile_dictionnary;
   char dictionarry_name[SIZEWORD];
   int len;
   pFile_dictionnary = fopen (argv[1] , "r");
   if (pFile_dictionnary == NULL) perror ("Error while opening the dictionnary");
   else
   {
       while (!feof (pFile_dictionnary) )
       {
        if ( fgets (dictionarry_name , SIZEWORD , pFile_dictionnary) == NULL )     break;   
       printf("Before : dictionarry_name is = [%s] \n", dictionarry_name);
       /*remove new line*/     
       char *tmp_LF = strrchr(dictionarry_name, '\n');
       if(tmp_LF != NULL)*tmp_LF = '\0';
       printf("After : dictionarry_name is = [%s] \n", dictionarry_name);       
        }
   }
    fclose (pFile_dictionnary);

 return 0;
}

有人可以向我解释为什么我有这个输出?我正在尝试删除由fgets函数添加的新行,但它似乎没有效果:

Before : dictionarry_name is = [john
] 
After : dictionarry_name is = [john
] 
Before : dictionarry_name is = [philips
] 
After : dictionarry_name is = [philips
] 
Before : dictionarry_name is = [dudule
] 
After : dictionarry_name is = [dudule
] 
Before : dictionarry_name is = [henry
] 
After : dictionarry_name is = [henry
] 

感谢您的帮助

Ps:很抱歉显示效果不好,但我很难理解如何轻松完成

1 个答案:

答案 0 :(得分:0)

删除行结尾的更简洁方法是使用strtok()或strtok_r()。在这里,我更改了您的代码以使用strtok()来消除任何LF,CR或两者。我也摆脱了EOF检查。这将简单地循环,直到fgets()无法读取。当然,在一个真实的程序中,你可能想要在之后检查errno以查看是否有任何问题。

while(fgets(dictionarry_name, SIZEWORD, pFile_dictionnary) != NULL) {
    printf("Before : dictionarry_name is = [%s] \n", dictionarry_name);
    while(strtok(dictionarry_name, "\r\n") != NULL);
    printf("After : dictionarry_name is = [%s] \n", dictionarry_name);       
}

我提到strtok_r的原因是因为strtok适用于单线程程序..而你的是单线程的。但是稍后,如果您处理多线程程序,则必须使用strtok_r(),它是线程安全的。

希望这有帮助。