2014-06-30 2 views
0

나는 어리석은 질문이 있습니다. .txt 파일이 있습니다. 일단 열면, 나는 숫자 만 빼고 단어를 건너 뛰기 만하면됩니다. 다음 요소가 단어인지 아닌지 확인하는 방법이 있습니까? C++이 file.txt의 다음 요소로 이동

내 파일이 같은 때문에

: 워드 1 2 워드 1 2 3 4 5 6 ...

int n,e; 
string s; 
ifstream myfile("input.txt"); 

을하고 그래서 내가 그 문자열을 사용하여 문제를 피하고의 내용을 넣어 바보 같은 방법을 생각 문자열과는 바로이 같은 번호를 가지고 :

myfile >> s; 
myfile >> n; 
myfile >> e; 
+0

주를 참조 할 수 있습니다 (myfile을 >> n이)'당신이 그것을 것 유효한 숫자를 읽으면 당신에게 충분히 경우 문' 그렇지 않다면 거짓으로 평가하십시오. –

답변

0

다음

int num = 0; 
while(myfile >> num || !myfile.eof()) { 
    if(myfile.fail()) { // Number input failed, skip the word 
     myfile.clear(); 
     string dummy; 
     myfile >> dummy; 
     continue; 
    } 
    cout << num << endl; // Do whatever necessary with the next number read 
} 

complete, working sample here

0

당신은 문자열로 모든 데이터를 가져오고 try {} catch() { } 블록의 정수로 데이터를 변환 시도 할 수 있습니다. 데이터가 실수 인 경우 try 섹션에서 작업을 수행하고, 그렇지 않으면 catch가 catch로 이동하고 catch에서 아무 작업도 수행하지 않습니다.

+0

예, 실패한 경우 문자열을 반복하고 나머지 위치를 다시 입력해야합니다 (예 : 입력이 "ABC12"인 경우). 시도가 성공하면 유효한 입력 이후에 또 다른 유효한 입력이있을 수 있으므로 루프해야합니다 (예 : "1-1"). – Christophe

0

파일에서 읽는 중에 모든 데이터가 문자열로 표시됩니다. 문자열이 숫자인지 확인해야합니다. 문자열을 정수로 변환하는 방법은 다음과 같습니다 (문자열이 정수인 경우). atoi() function 주의해야 할 점은 C 문자열을 전달해야한다는 것입니다.

+2

다음을 확인하십시오. http://en.cppreference.com/w/cpp/string/basic_string/stol –

+0

유용한 답변을 주셔서 감사합니다. 문자열을 int로 변환하는 방법을 알고 있습니다. 이제 질문이 하나 더 있습니다. 텍스트가 문자열인지 확인하는 방법은 무엇입니까? 나는 더 명확하게하려고 노력할 것이다.제가 있다면 텍스트 같은 제가 사용
2 데이터 4~10을 : myfile을 X >>; "데이터"가 int가 아닌 문자열인지 어떻게 알 수 있습니까? 내 문제는 내가 단어를 건너 뛸 필요가 있기 때문입니다 ... 답변을 미리 다시 한번 감사드립니다! –

+0

@manuello 당신은 몇 가지 유용한 포인터를 찾을 수 있습니다 [여기] (http://stackoverflow.com/questions/23047052/why-does-reading-a-struct-record-fields-from-stdistream-fail-and-how -can-i-fi). –

0

이미 해결되었습니다.

  • 중 하나를하는 것은 그들이 연산자 >>

  • 또는 PEEK() 다음 문자를 사용하기 전에 숫자 인 경우 스트림 및 푸시 백 (개별 문자)를 읽어하지만, 언급 할 가치에 대한 가능성도있다 '-'숫자가하지 않은 있지만 interger의 징후 일 수를 읽지 않고 스트림에 그것을 무시하거나 연산자를 사용하기 >>

는 그냥에 대한주의 하시고 여부를 decisde합니다. 여기에 작은 예를

:

int c, n, sign=1; 
ifstream ifs("test.txt", std::ifstream::in); 

while (ifs.good() && (c=ifs.peek())!=EOF) { 
    if (isdigit(c)) { 
     ifs >> n; 
     n *= sign; 
     sign = 1; 
     cout << n << endl; 
    } 
    else { 
     c=ifs.get(); 
     if (c == '-') 
      sign = -1; 
     else sign = 1; 
    } 
} 
ifs.close(); 

그것은 아니에요 가장 성능이 좋은 방법,하지만 그것은 단지 중간 문자열과 메모리 관리하지 않고, 스트림에서 읽기의 장점이있다.

+0

@ πάντα ῥεῖ 나는이 접근법을 설명하는 코드 조각에 -1을 넣는 것이 조금 가혹한 것을 알았습니다! – Christophe

+0

믿거 나 말거나, peek 및 pushback은 유용한 기능입니다. 너는 건설적이지 않다. 다른 불완전한 대답에 의견을 제시하여 개선 할 방법을 제안하는 것을 선호합니다. – Christophe

+0

_ '너는 그다지 건설적이지 않다.'_ 내 질문을 보라. 약 4-5 줄의 코드에서 OP 문제를 해결하는 것이 모두 필요합니다. 다른 답변으로 더 많은 코드를 표시해도이 코드를 본질적으로 개선하지는 못합니다. –

관련 문제