2012-08-17 2 views
2

bash 명령의 출력을 줄마다 벡터 벡터로 읽어야합니다. ifstream을 사용하여이 코드를 시도했지만 오류가 발생합니다. ifstream 대신 구문 분석에 사용해야하는 것은 무엇입니까?C++의 문자열 벡터에 한 줄씩 명령 출력을 읽습니다.

using namespace std; 

int main() 
{ 
    vector<string> text_file; 
    string cmd = "ls"; 

    FILE* stream=popen(cmd.c_str(), "r"); 
    ifstream ifs(stream); 

    string temp; 
    while(getline(ifs, temp)) 
    text_file.push_back(temp); 
    for (int i=0; i<text_file.size(); i++) 
     cout<<text_file[i]<<endl; 
} 
+1

을 사용하려는 생각합니다. C I/O를 사용하고 그 결과를'std :: string'으로 변환 할 필요가 있습니다. 당신이 정말로 ** 원하는 것은 부스트입니다. 파일 시스템. – pmr

+0

@pmr Boost Filesystem은 파이프와 무슨 관련이 있습니까? –

+0

"오류가 발생했습니다"는 아주 좋은 문제 설명이 아닙니다. 그것은 컴파일 타임 오류입니까? 런타임 오류? 특정 오류 메시지가 있습니까? 아니면 당신이 예상했던 것과 다른 행동을합니까? –

답변

1

C++ iostream 기능에는 C 입출력을 사용할 수 없습니다. popen을 실제로 사용하려면 read으로 결과에 액세스해야합니다.

ls이 정말로 원하는 경우 Boost.Filesystem 을 사용해보세요.

#include <boost/filesystem.hpp> 
#include <vector> 

int main() 
{ 
    namespace bfs = boost::filesystem; 
    bfs::directory_iterator it{bfs::path{"/tmp"}}; 
    for(bfs::directory_iterator it{bfs::path{"/tmp"}}; it != bfs::directory_iterator{}; ++it) { 
    std::cout << *it << std::endl; 
    } 

    return 0; 
} 
0

나는 당신이 C 라이브러리 파일 스트림과`ifstream`을 사용할 수 없습니다 GNU 라이브러리 함수를 getline

int main() 
{ 
    vector<string> text_file; 
    FILE *stream = popen ("ls", "r"); 
    char *ptr = NULL; 
    size_t len; 
    string str; 

    while (getline (&ptr, &len, stream) != -1) 
    { 
     str = ptr; 
     text_file.push_back (str); 
    } 
    for (size_t i = 0; i < text_file.size(); ++i) 
     cout << text_file[i]; 
} 
관련 문제