我在写一些C++代码,我需要根据文件的内容预先分配一个数组。我可以肯定地读取该文件,并解析字符串一定的方式,但它必须容易从以下Linux的一行找到合适的号码:从C++调用'猫'的简单方法?
cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w
什么是要使用单一一个衬垫的最佳方式从C++代码中的文件?
我在写一些C++代码,我需要根据文件的内容预先分配一个数组。我可以肯定地读取该文件,并解析字符串一定的方式,但它必须容易从以下Linux的一行找到合适的号码:从C++调用'猫'的简单方法?
cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w
什么是要使用单一一个衬垫的最佳方式从C++代码中的文件?
使用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
来关闭流。
我认为调用你的缓冲区“路径”相当混乱。 'wc -w'的输出是一个数字。 –
这是真的,我复制粘贴我的代码从输出行是路径的地方。 –
因此,我将缓冲区重命名为“缓冲区”。 –
使用标准库中的system
函数(从C继承)。喜欢的东西:
system("cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w");
这个函数的文档是在这里:http://www.cplusplus.com/reference/cstdlib/system/
要得到的结果 - 从wc
输出重定向到一个文件,然后打开该文件,并strtod
其内容。
这将启动命令,但不会得到结果。 –
系统的问题是获取wc命令的结果。 ret val只是一个int标志。一个简单的工作将是在wc中包含> tmp_fil,然后以“常用”方式读取文件。但我想popen,如其他答案中所建议的,可能更方便 –
您可能想要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()
阅读您的答案。
使用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 ---
可能出现超过每行一次。如果它不会出现一次以上,代码可能会更简单一些。
您可以使用系统调用:fork(),pipe()和execlp()。但我认为这可以做得更容易。 – SashaMN
http://linux.die.net/man/3/popen – PSkocik
作为程序的参数,即。的argv [1]? – kometen