2011-09-13 3 views
0

텍스트 파일에서 위치를 점프 할 수 있는지 궁금합니다. 이 파일이 있다고 가정합니다.Advance File 파일의 번호 건너 뛰기 포인터

12 
8764 
2147483648 
2 
-1 

나는 그것 내가 세 번째 수에 도달 할 때마다 32 비트 int.So의 최대 수보다 더 큰, 그것은 다시 두 번째 위에 읽는 유지하고 있기 때문에 읽지 않습니다 세 번째 수를 읽으려고 할 때마다 . 네 번째 숫자로 어떻게 이동할 수 있습니까? 대신 운영자의

+0

인가? –

답변

6

를 사용하여 표준 : :의 getline >> (표준 : : IStream을, int)를

std::istream infile(stuff); 
std::string line; 
while(std::getline(infile, line)) { 
    int result; 
    result = atoi(line.c_str()); 
    if (result) 
     std::cout << result; 
} 

이유 당신이, 당신이 행동을 경험하고는 그 때 표준 :: istream로의 시도 (실패 할 경우) 정수로 읽으려는 경우 "badbit"플래그가 설정되어 무언가 잘못되었음을 의미합니다. 해당 badbit 플래그가 설정된 상태로 있으면 아무 것도 수행하지 않습니다. 따라서 실제로는 그 라인에서 다시 읽지 않습니다. 아무 것도하지 않고 홀로 존재했던 가치를 떠납니다. 당신이 이미 가지고 있던 것과 더 많은 것을 맞추고 싶다면, 그것은 아마도 아래와 같습니다. 위의 코드는 더 간단하고 오류가 발생하기 쉽습니다.

std::istream infile(stuff); 
int result; 
infile >> result; //read first line 
while (infile.eof() == false) { //until end of file 
    if (infile.good()) { //make sure we actually read something 
     std::cout << result; 
    } else 
     infile.clear(); //if not, reset the flag, which should hopefully 
         // skip the problem. NOTE: if the number is REALLY 
         // big, you may read in the second half of the 
         // number as the next line! 
    infile >> result; //read next line 
} 
+0

'atoi'는 언제'std :: string'에 대한 과부하가 있습니까 ?? –

+0

그래도 그랬 으면 좋겠어. –

+0

만약 소원이 소스라면 ... –

0

가능한 경우 줄을 읽고 그 줄을 정수로 변환 할 수 있습니다. 다음은 파일의 예는 다음과 같습니다 대안으로

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 

int main() 
{ 
    std::ifstream in("file"); 
    std::string line; 
    while (std::getline(in, line)) { 
     int value; 
     std::istringstream iss(line); 
     if (!(iss >> value)) { 
      std::istringstream iss(line); 
      unsigned int uvalue; 
      if (iss >> uvalue) 
       std::cout << uvalue << std::endl; 
      else 
       std::cout << "Unable to get an integer from this" << std::endl; 
     } 
     else 
      std::cout << value << std::endl; 
    } 
} 
+0

istringstream을 (더 "정확하다") 생각했지만, 숫자가있는 것 같아서 atoi를 사용하는 것이 더 빠르고 간결합니다. 그가 숫자 이상을 가지고 있다면, 이것은 더 나은 대답입니다. 또한 그는 부호있는 32 비트 범위의 값만 처리하는 것으로 보이므로 내부 'iss'는 제거 할 수 있습니다. –

0

std::getline()을 사용하여, 당신은 std::ios::clear()를 호출 할 수 있습니다. 당신이 함께 그 코드를 대체 할 수있는 당신의 previous question

fin >> InputNum; 

에서이 발췌을 고려 : 그것은 더 이상 정수를 사용하는 옵션

fin >> InputNum; 
    if(!fin) 
     fin.clear();