我正在编写一些C ++代码,我需要根据文件内容预先分配一个数组。我绝对可以读取文件并以某种方式解析字符串,但它必须更容易从以下Linux单行中找到正确的数字:
cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w
在C ++代码中对文件使用这个单一衬垫的最佳方法是什么?
答案 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;
}
来阅读您的答案。