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