我在寫一些C++代碼,我需要根據文件的內容預先分配一個數組。我可以肯定地讀取該文件,並解析字符串一定的方式,但它必須容易從以下Linux的一行找到合適的號碼:從C++調用'貓'的簡單方法?
cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w
什麼是要使用單一一個襯墊的最佳方式從C++代碼中的文件?
我在寫一些C++代碼,我需要根據文件的內容預先分配一個數組。我可以肯定地讀取該文件,並解析字符串一定的方式,但它必須容易從以下Linux的一行找到合適的號碼:從C++調用'貓'的簡單方法?
cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w
什麼是要使用單一一個襯墊的最佳方式從C++代碼中的文件?
使用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
來關閉流。
我認爲調用你的緩衝區「路徑」相當混亂。 'wc -w'的輸出是一個數字。 –
這是真的,我複製粘貼我的代碼從輸出行是路徑的地方。 –
因此,我將緩衝區重命名爲「緩衝區」。 –
使用標準庫中的system
函數(從C繼承)。喜歡的東西:
system("cat myfile.txt | grep 'Freqs ---' | sed 's/Freqs ---//g' | wc -w");
這個函數的文檔是在這裏:http://www.cplusplus.com/reference/cstdlib/system/
要得到的結果 - 從wc
輸出重定向到一個文件,然後打開該文件,並strtod
其內容。
這將啓動命令,但不會得到結果。 –
系統的問題是獲取wc命令的結果。 ret val只是一個int標誌。一個簡單的工作將是在wc中包含> tmp_fil,然後以「常用」方式讀取文件。但我想popen,如其他答案中所建議的,可能更方便 –
您可能想要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;
}
您也可以從管道讀取(就像你可以從一個文件),然後會用,說,fscanf()
閱讀您的答案。
使用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 ---
可能出現超過每行一次。如果它不會出現一次以上,代碼可能會更簡單一些。
您可以使用系統調用:fork(),pipe()和execlp()。但我認爲這可以做得更容易。 – SashaMN
http://linux.die.net/man/3/popen – PSkocik
作爲程序的參數,即。的argv [1]? – kometen