2016-01-23 48 views
0

我在写一些C++代码,我需要根据文件的内容预先分配一个数组。我可以肯定地读取该文件,并解析字符串一定的方式,但它必须容易从以下Linux的一行找到合适的号码:从C++调用'猫'的简单方法?

cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w 

什么是要使用单一一个衬垫的最佳方式从C++代码中的文件?

+2

您可以使用系统调用:fork(),pipe()和execlp()。但我认为这可以做得更容易。 – SashaMN

+0

http://linux.die.net/man/3/popen – PSkocik

+0

作为程序的参数,即。的argv [1]? – kometen

回答

4

使用popen<stdio.h>

FILE *fp; 
char buffer[BUFFER_SIZE]; 

fp = popen("cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w", "r"); 
if (fp != NULL) 
{ 
    while (fgets(buffer, BUFFER_SIZE, fp) != NULL) 
     printf("%s", buffer); 
    pclose(fp); 
} 

popen的返回值是一个标准的I/O流,就像一个由fopen返回。但是,您应该使用pclose而不是fclose来关闭流。

+1

我认为调用你的缓冲区“路径”相当混乱。 'wc -w'的输出是一个数字。 –

+0

这是真的,我复制粘贴我的代码从输出行是路径的地方。 –

+0

因此,我将缓冲区重命名为“缓冲区”。 –

0

使用标准库中的system函数(从C继承)。喜欢的东西:

system("cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w"); 

这个函数的文档是在这里:http://www.cplusplus.com/reference/cstdlib/system/

要得到的结果 - 从wc输出重定向到一个文件,然后打开该文件,并strtod其内容。

+0

这将启动命令,但不会得到结果。 –

+0

系统的问题是获取wc命令的结果。 ret val只是一个int标志。一个简单的工作将是在wc中包含> tmp_fil,然后以“常用”方式读取文件。但我想popen,如其他答案中所建议的,可能更方便 –

0

您可能想要popen(),但这种方法并非全部是便携式。

这里是21岁(!!)代码片段我有一个misc/C/子目录:

/* edd 01.11.95 write pipe to "wc" command */ 

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

int main() { 
    FILE *pipe; 

    pipe = popen("wc", "w"); 
    fprintf(pipe, "w\n"); 
    fprintf(pipe, "wc\n"); 
    pclose(pipe); 
    return 0; 
} 

您也可以从管道读取(就像你可以从一个文件),然后会用,说,fscanf()阅读您的答案。

1

使用system()可能是一个危险的业务(在恶劣的环境中)。 使用popen()并不好。 真的是更好地学习如何在你的程序中做这样的事情:

这将得到一个文件的大小。

#include <stdlib.h> 
#include <sys/stat.h> 
... 
struct stat st; 
... 
size_t bytes = 0; 

if (stat("myfile.txt", &sb) == -1) { /* an error, do something */ } 
else bytes = st.st_size; 

但是做什么你一个班轮确实需要读取文件:

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

size_t bytes = 0; 
char line[256]; 
FILE * fp = fopen("myfile.txt", "r"); 
char * p; 
char * freqs; 
int  n; 

if (fp == NULL) { /* an error, do something */ } 
else while (fgets(line, sizeof(line), fp) != NULL) { 
    for (n = 0, p = line; (p = strstr(p, "Freqs ---")) != NULL; n++) { 
     p += 9;         /* skip past found one */ 
    } 
    if (n != 0) bytes += strlen(line) - (n * 9); /* line len less n "Freqs ---" */ 
} 
if (fp) fclose(fp); 

因为在你sed命令g,我认为Freqs ---可能出现超过每行一次。如果它不会出现一次以上,代码可能会更简单一些。