我正在编写一个程序,它将使用以下语法读取一个字典:
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:很抱歉显示效果不好,但我很难理解如何轻松完成
答案 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(),它是线程安全的。
希望这有帮助。