从 C++ 调用 'cat' 的简单方法?

Simple way to call 'cat' from c++?

我正在编写一些 C++ 代码,我需要根据文件的内容预先分配一个数组。我绝对可以读取文件并以某种方式解析字符串,但是从以下 Linux 一行中找到正确的数字一定更容易:

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

在 C++ 代码中对文件使用这一单行的最佳方法是什么?

使用标准库中的 system 函数("inherited" 来自 C)。类似于:

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

此函数的文档在此处:http://www.cplusplus.com/reference/cstdlib/system/

要获得结果 - 来自 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;
}

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

使用 <stdio.h> 中的 popen:

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 的 return 值是一个标准的 I/O 流,就像 return 由 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;

但是,要执行您的一个班轮所做的事情,需要阅读文件:

#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 --- 每行可能出现不止一次。如果它永远不会出现超过一次,代码可能会更简单一些。