2013-08-09 6 views
0

입력 파일이 있습니다. 여기에는 많은 입력 값이 포함됩니다. 하나의 객체에 대한 입력과 같은 경우 :파일에서 다중 단어 읽기

hss cscf "serving cscf" 32.5 ims 112.134 

(참고 : 객체의 변수가 하나의 단어 문자열, 내가 .... ""사용 멀티 단어 문자열을 필요로 할 때, 그것은 따옴표없이)

ifstream을 사용하여 어떻게 읽을 수 있습니까? (Google에서 검색했지만 찾지 못했습니다.)

getline을 사용하여 전체 라인을 읽으려고했으나 한 단어 또는 다중 단어 입력 여부를 알아 냈을 때 다시 고생했습니다!

몇 가지 제안 사항을 알려주십시오.

+0

좋아, 내가 선을 읽고 다음 char에 의해 char 검색. 그것의 '' '', 나는 그것의 다중 단어를 안다.하지만 정수 나 부동에 관해서는 붙어있다. char에 대해 if (line [i]> = 'a'&& line [i] <= 'z ')하지만 integer 또는 float이 다음 값일 때 어떻게 진행할 것인가? – Jigyasa

답변

1

희망이 프로그램은

int main() 
{ 
    fstream fstr; 
    fstr.open("abc.txt",ios::in); 
    string str; 
    vector<string> Vec; 
    while(getline(fstr,str)) 
    { 
     char* pch; 
     bool flag = false; 
     string strTmp; 
     int counter=0; 
     pch = strtok (const_cast<char*>(str.c_str())," "); 
     while (pch != NULL) 
     { 
      //this "is a" sample 
      if(pch[0]=='\"') 
      { 
       flag = true; 
       strTmp = strTmp + " " + string(pch).substr(1,strlen(pch)-1); 
      } 
      else 
      { 
       if(flag==true) 
       { 
        if(pch[strlen(pch)-1]=='\"') 
        { 
         flag=false; 
         strTmp = strTmp + " " + string(pch).substr(0,strlen(pch)-1); 
         Vec.push_back(strTmp); 
        } 
        else 
        { 
         strTmp = strTmp + " " + pch; 
        } 
       } 
       else 
       { 
        Vec.push_back(pch); 
       } 
      } 
      pch = strtok(NULL," "); 
     } 

    } 
    for(auto itr = Vec.begin();itr!=Vec.end();itr++) 
     { 
      cout<<*itr<<endl; 
     } 
     getchar(); 
} 

그냥 요약

  1. Extact 각 라인을 제공 밖으로 당신을 도와줍니다 얻을 구분 기호로 공간 strtok를 사용하여 단어. (여기에서, 심지어 단어 따옴표는 여러 단어로 처리하지 않고 단일 단어로 추출됩니다.

  2. 추출한 단어마다 시작으로 그렇지 않은가. 없으면 벡터에 추가하고 임시 문자열에 추가 한 다음 플래그도 사용 가능하게 설정하십시오.

  3. 이제 단어가 따옴표로 끝나는 지 여부와 플래그가 설정되었는지 여부를 확인하십시오. 둘 다 만족하면 임시 문자열 전체를 vecor에 추가하거나 임시 문자열에 단어를 계속 추가하십시오.

요약하면 임시 문자열에서 단어를 따옴표로 묶어 벡터에 단일 단어를 직접 추가합니다. 따옴표가 끝나면 임시 문자열도 벡터에 추가됩니다.

1

파일 스트림에서 입력을 구문 분석하려고하고 여러 단어의 가능성을 다루므로 일반 지원과 완벽하게 사용자 정의 할 수있는 경우 - 즉, 입력 유형이 이면 Regular Expressions이 필요합니다.

gcc의 순간에는 C++ 11의 정규식을 사용할 수 있지만 그 때는 isn't supported입니다.

그래서, 하나 개의 솔루션은 ++ 03과 C c를 표준 C++ 98 작동합니다 부스트 C++ 라이브러리를 사용하는 것입니다 + +0 :

#include <string> 
#include <iostream> 
#include <cstdlib> 
#include <boost/regex.hpp> 
using namespace std; 

int main() { 
    string text = "hss cscf \"serving\" 32.5 ims 112.134"; 

    boost::regex e("(\\w+)\\s(\\w+)\\s\"(\\w+\\s?)+\"\\s([0-9]+(\\.[0-9][0-9]?)?)\\s(\\w+)\\s([0-9]+(\\.[0-9][0-9]?)?)"); 

    boost::sregex_token_iterator iter(text.begin(), text.end(), e, 0); 
    boost::sregex_token_iterator end; 

    for(; iter != end; ++iter) { 
    std::cout << *iter << std::endl; 
    } 

    return 0; 
} 

당신은 (GCC를 사용하여 컴파일 할 수 있습니다 나는 gcc-4.7을 사용했다.2)를 통해 다음과 같은 : 당신이 전체 decimal parsing using a regex를 지원하기 위해, 소원 경우 horridly 긴 정규식, 다음 위의 다음과 같은 문자열이 제대로 작동 이유에 관해서는

g++ {filename} -std={language version} -I{your boost install location} -L{your boost library location} -o {output filename} {your boost library location}/libboost_regex.a 

:

"hss cscf \"serving\" 32.5 ims 112.134" 
"hss cscf \"serving more than one\" 32.5 ims 112.134" 
"hss cscf \"serving\" 32 ims 112" 

참고 :

부스트 Regex : http://www.solarix.ru/for_developers/api/regex-en.html