这可能是一个愚蠢的问题,但我已经花了几个小时来解决这个问题,这让我发疯了。
如果对fgets行进行评论(如提供的话),那么小代码就可以正常工作。 一旦我删除评论,整个功能将不会做任何事情。我的进程jut冻结 - 甚至在未执行fgets之前的printf。
void RetirerTransaction(char* filePath, char* transaction) {
FILE* f;
FILE* result;
char tempStr[128];
char line[100];
printf(">>%s<<",filePath); // Just to check everything is ok
strcpy(tempStr,"grep -v \"");
strcat(tempStr,transaction);
strcat(tempStr,"\"");
strcat(tempStr,filePath); // tempStr = grep -v "XXX" myfile
result = popen(tempStr, "r");
/*
if (fgets(line,100,result)) {
printf("OK");
}
*/
}
提前谢谢。
答案 0 :(得分:1)
您错过了模式的结束引号和grep的file参数之间的空格。这使包括文件名在内的整个内容被视为模式。
默认情况下,grep从标准输入读取。它阻止尝试从stdin读取,因为它没有文件参数。
添加这样的空格,你就可以了:
strcat(tempStr,"\" ");
答案 1 :(得分:0)
检查下面的代码。请添加检查popen返回值。如果popen失败并且您正在尝试执行fgets(),那么它可能会导致崩溃。
result = popen(tempStr, "r");
if(result == NULL)
return;
else
fgets(line,100,result);