2017-01-02 4 views
1

을 얻고있다. 나는 .eof에 도달하는 동안 루프를 설정할 때마다() 그것이 표준 :: bad_alloc 뿐이다을 반환이유는 아래의 코드를 실행할 때이 문제에 봉착 성병 :: bad_alloc 뿐이다 오류

inFile.open(fileName, std::ios::in | std::ios::binary); 

     if (inFile.is_open()) 
     { 
      while (!inFile.eof()) 
      { 
       read(inFile, readIn); 
       vecMenu.push_back(readIn); 
       menu.push_back(readIn); 
       //count++; 
      } 

      std::cout << "File was loaded succesfully..." << std::endl; 

      inFile.close(); 
     } 

그것은 내가 미리 설정된 횟수의 반복을 설정하면 잘 실행,하지만 난 EOF의 연료 소모량을 사용하면 실패합니다. 다음은 읽기 함수의 코드입니다.

void read(std::fstream& file, std::string& str) 
{ 
    if (file.is_open()) 
    { 
     unsigned len; 
     char *buf = nullptr; 

     file.read(reinterpret_cast<char *>(&len), sizeof(unsigned)); 

     buf = new char[len + 1]; 

     file.read(buf, len); 

     buf[len] = '\0'; 

     str = buf; 

     std::cout << "Test: " << str << std::endl; 

     delete[] buf; 
    } 
    else 
    { 
     std::cout << "File was not accessible" << std::endl; 
    } 
} 

제공 할 수있는 도움이 있으면 감사하겠습니다. 참고 : 나는 vecMenu 유형의 표준 인 것이 : 벡터 언급하는 데 실패하고 메뉴 형 표준이다 :: 목록

+3

이 게시물을 참조하십시오 : [? 왜 iostream :: EOF 잘못된 생각 루프 조건 내부 (http://stackoverflow.com/questions/ 5605125/왜-IS-iostreameof - 내 - 어 - 루프 조건으로 간주-잘못) – Rakete1111

+0

당신이 읽을 프로그램을 늦추고 때마다 한 줄의 할당을 호출, 또한 Rakete1111 – Akatosh

+1

@ 주셔서 감사합니다. 비 로컬'std :: vector'를 사용하고 매번'new/delete' 호출을하는 것보다'resize()'호출을하는 것이 더 좋습니다. – PaulMcKenzie

답변

1

내가 볼 수있는 주요 문제가 있습니다 : 당신은 종료 while (!inFile.eof())를 사용하는

  1. 을 루프. Why is iostream::eof inside a loop condition considered wrong?을 참조하십시오.

  2. 당신은 ifstream::read에 대한 호출로 읽은 변수를 사용하기 전에 성공 여부를 확인하지 않습니다.

내가 제안 :

  1. ifstream에 대한 참조를 반환 read의 버전을 변경. 입력으로 가져 오는 ifstream을 반환해야합니다. 이렇게하면 루프 조건부에서 read에 대한 호출을 사용할 수 있습니다.

  2. ifstream::read에 대한 호출이 사용하기 전에 성공 여부를 확인.

  3. read에 전화를 걸 때 while 문을 조건부로 사용합니다.

std::ifstream& read(std::fstream& file, std::string& str) 
{ 
    if (file.is_open()) 
    { 
     unsigned len; 
     char *buf = nullptr; 

     if !(file.read(reinterpret_cast<char *>(&len), sizeof(unsigned))) 
     { 
     return file; 
     } 

     buf = new char[len + 1]; 

     if (!file.read(buf, len)) 
     { 
     delete [] buf; 
     return file; 
     } 

     buf[len] = '\0'; 

     str = buf; 

     std::cout << "Test: " << str << std::endl; 

     delete[] buf; 
    } 
    else 
    { 
     std::cout << "File was not accessible" << std::endl; 
    } 

    return file; 
} 

inFile.open(fileName, std::ios::in | std::ios::binary); 

if (inFile.is_open()) 
{ 
    std::cout << "File was loaded succesfully..." << std::endl; 

    while (read(inFile, readIn)) 
    { 
     vecMenu.push_back(readIn); 
     menu.push_back(readIn); 
     //count++; 
    } 

    inFile.close(); 
}