调用'的简单方法;cat&x27;来自c++;? 我正在编写一些C++代码,我需要预先根据文件的内容分配一个数组。我完全可以读取文件并以某种方式解析字符串,但从以下Linux one liner中找到正确的数字肯定更容易: cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w 从C++代码中使用这个单一的一行文件的最佳方法是什么?

调用'的简单方法;cat&x27;来自c++;? 我正在编写一些C++代码,我需要预先根据文件的内容分配一个数组。我完全可以读取文件并以某种方式解析字符串,但从以下Linux one liner中找到正确的数字肯定更容易: cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w 从C++代码中使用这个单一的一行文件的最佳方法是什么?,c++,linux,cat,C++,Linux,Cat,从标准库(从C继承)使用系统函数。比如: system("cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w"); 此功能的文档如下所示: 要从wc获取结果-输出,请将其重定向到一个文件,然后打开该文件并strtod其内容。您可能需要popen(),但这种方法并不是完全可移植的 这是我在misc/C/子目录中的21岁(!!)片段: /* edd 01.11.95 write pipe to "wc" command

从标准库(从C继承)使用<代码>系统<代码>函数。比如:

system("cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w");
此功能的文档如下所示:


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

您可能需要
popen()
,但这种方法并不是完全可移植的

这是我在
misc/C/
子目录中的21岁(!!)片段:

/* 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;
}
/*edd 01.11.95将管道写入“wc”命令*/
#包括
#包括
int main(){
文件*管道;
管道=波本(“wc”、“w”);
fprintf(管道,“w\n”);
fprintf(管道,“wc\n”);
pclose(管道);
返回0;
}

您也可以从管道中读取(就像您可以从文件中读取一样),然后使用,例如,
fscanf()
来读取您的答案。

使用
popen
读取:

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

使用
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;
#包括
#包括
...
结构统计;
...
大小\u t字节=0;
如果(stat(“myfile.txt”,&sb)=-1){/*出现错误,请执行一些操作*/}
else字节=st.st\U大小;
但是,要执行one liner所做的操作,需要读取文件:

#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);
#包括
#包括
#包括
大小\u t字节=0;
字符行[256];
FILE*fp=fopen(“myfile.txt”、“r”);
char*p;
字符*频率;
int n;
如果(fp==NULL){/*出现错误,请执行某些操作*/}
else while(fgets(line,sizeof(line),fp)!=NULL){
for(n=0,p=line;(p=strstrstr(p,“Freqs----”)!=NULL;n++){
p+=9;/*跳过找到的一个*/
}
如果(n!=0)字节+=strlen(行)-(n*9);/*行len减去n“频率--”*/
}
if(fp)fclose(fp);

由于
sed
命令中的
g
,我假设
Freqs---
可能每行出现一次以上。如果它从未出现过多次,代码可能会简单一些。

可以使用系统调用:fork()、pipe()和execlp()。但是我认为这可以做得更简单。作为程序的一个参数,即argv[1]?为什么您认为分叉这四个进程比使用您选择的语言从文件中提取数字更容易?编写代码更快;)系统的问题是获取wc命令的结果。ret val只是一个int标志。一个简单的工作方法是在wc中包含>tmp_fil,然后以“通常”的方式读取文件。但我想popen,正如其他答案中所建议的,可能更方便。我认为调用缓冲区
路径
相当令人困惑。
wc-w
的输出是一个数字。没错,我从输出行是路径的位置复制粘贴了代码。因此,我将缓冲区重命名为
buffer
#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);