C - fgets怪异的行为

时间:2014-11-26 17:15:25

标签: c popen fgets

这可能是一个愚蠢的问题,但我已经花了几个小时来解决这个问题,这让我发疯了。

如果对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");
    }
    */
}

提前谢谢。

2 个答案:

答案 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);