简单的方式来打电话“猫”#39;来自c ++?

时间:2016-01-23 23:22:07

标签: c++ linux cat

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

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

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

4 个答案:

答案 0 :(得分: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 :(得分: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);

由于g命令中的sed,我认为Freqs ---每行可能会出现多次。如果它永远不会出现多次,那么代码可能会更简单一些。

答案 2 :(得分:0)

使用标准库中的system函数(来自C的“继承”)。类似的东西:

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

此功能的文档位于:http://www.cplusplus.com/reference/cstdlib/system/

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

答案 3 :(得分:0)

您可能想要 private void button1_Click(object sender, EventArgs e) { HtmlDocument doc = webBrowser1.Document; doc.GetElementById("inputSession").SetAttribute("Value", gpin); } private void button2_Click(object sender, EventArgs e) { HtmlElement headElement = webBrowser1.Document.GetElementsByTagName("head")[0]; HtmlElement scriptElement = webBrowser1.Document.CreateElement("script"); IHTMLScriptElement element = (IHTMLScriptElement)scriptElement.DomElement; element.text = @"function sayHello() $('button[type=""submit""]').first().submit()"; headElement.AppendChild(scriptElement); webBrowser1.Document.InvokeScript("sayHello"); } ,但这些方法并非都是可移植的。

这是我在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; } 来阅读您的答案。