2016-01-23 81 views
0

我在寫一些C++代碼,我需要根據文件的內容預先分配一個數組。我可以肯定地讀取該文件,並解析字符串一定的方式,但它必須容易從以下Linux的一行找到合適的號碼:從C++調用'貓'的簡單方法?

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

什麼是要使用單一一個襯墊的最佳方式從C++代碼中的文件?

+2

您可以使用系統調用:fork(),pipe()和execlp()。但我認爲這可以做得更容易。 – SashaMN

+0

http://linux.die.net/man/3/popen – PSkocik

+0

作爲程序的參數,即。的argv [1]? – kometen

回答

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

我認爲調用你的緩衝區「路徑」相當混亂。 'wc -w'的輸出是一個數字。 –

+0

這是真的,我複製粘貼我的代碼從輸出行是路徑的地方。 –

+0

因此,我將緩衝區重命名爲「緩衝區」。 –

0

使用標準庫中的system函數(從C繼承)。喜歡的東西:

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

這個函數的文檔是在這裏:http://www.cplusplus.com/reference/cstdlib/system/

要得到的結果 - 從wc輸出重定向到一個文件,然後打開該文件,並strtod其內容。

+0

這將啓動命令,但不會得到結果。 –

+0

系統的問題是獲取wc命令的結果。 ret val只是一個int標誌。一個簡單的工作將是在wc中包含> tmp_fil,然後以「常用」方式讀取文件。但我想popen,如其他答案中所建議的,可能更方便 –

0

您可能想要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()閱讀您的答案。

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); 

因爲在你sed命令g,我認爲Freqs ---可能出現超過每行一次。如果它不會出現一次以上,代碼可能會更簡單一些。