1

我正在尝试在 UNIX 下编写 C 代码以从文本的每一行读取第三个单词,并使用 POPEN 将其存储到字符串中。但是,我的代码在我的 while 循环内的行中给了我一个错误(赋值运算符需要可修改的左值)。这是我的代码:

    int main() {

int license = 0;
char number[100];


FILE *file = popen("grep User results_today.TXT_05012013 > filename", "r");
if ( file != NULL)
{
    char line [128];
    while (fgets(line, sizeof line, file) != NULL)
    {

        number = popen("cut -f3 -d' '", "r");

    }
    fclose (file);

    printf("Hello %s\n", number);
}

我知道这里有一些错误,因为我对 C 还是有点陌生​​。但请帮我纠正它们,谢谢!

4

3 回答 3

2
FILE *file = popen("grep User results_today.TXT_05012013 > filename", "r");

这将运行一个grep命令来查找User并将输出重定向到文件filename。它将返回一个FILE *允许您读取此命令的输出的值,但由于该输出已被重定向,您将一无所获。

popen("cut -f3 -d' '", "r");

这将运行该cut命令,因为它没有文件参数,它将从 stdin 读取并写入 stdout,popen 返回可以读取该命令FILE *,但您没有做任何事情。

您可能想要更多类似的东西:

char line[128];
int number;
FILE *file = popen("grep User results_today.TXT_05012013 | cut -f3 -d' '", "r");
if (file) {
    while (fgets(line, sizeof line, file)) {
        if (sscanf(line, "%d", &number) == 1) {
            printf("It's a number: %d\n", number);
        }
    }
    pclose(file);
}
于 2013-05-09T02:35:48.563 回答
1

您将 popen 的结果分配给一个固定大小的 char 数组。这是不可能的。

number = popen("cut -f3 -d' '", "r");

像第一个 popen 一样做 -> 将其分配给 FILE *file2

于 2013-05-08T23:53:55.577 回答
1

首先,我不是 C 程序员这是我的实现(当然有很多借用的行;))。我只是受够了

popen
while fgets
 printf // I want to store in char* got it?

所以这里是代码。它可能并不完美,但可以完成工作:)

#include <stdio.h>
#include <stdlib.h>

#include <string.h>

char* concatenate(char * dest, char * source) {
    char * out = (char *)malloc(strlen(source) + strlen(dest) + 1);

    if (out != NULL) {
            strcat(out, dest);
            strcat(out, source);
    }

    return out;
}

char * executeCmd(char * cmd) {
    FILE *fp;

    int BUFF_SIZE = 1024;

    int size_line; 
    char line[BUFF_SIZE];

    char* results = (char*) malloc(BUFF_SIZE * sizeof(char));

    if (cmd != NULL) {
            /* Open the command for reading. */
            fp = popen(cmd, "r");
            if (fp != NULL) {

            /* Read the output a line at a time - output it. */
            while (fgets(line, size_line = sizeof(line), fp) != NULL) {
                    results = concatenate(results, line);
            }
            }
            /* close */
            pclose(fp);
    } // END if cmd ! null

    return results;
}


int main( int argc, char *argv[] ) {
    char * out = executeCmd("ls -l");
    printf("%s\n", out);

    return 0;
}
于 2015-09-18T09:39:00.480 回答