2013-05-03 37 views
0

我試圖找出不需要的尾端數據在一個文件中的原因我正在寫入特定的數據,並不相信我寫入文件時發生錯誤。期待eof,但相當任意的數據附近eof

輸出看起來像:

building  room_numbr capacity 

packard | 101  | 500  | 
painter | 514  | 10   | 
ÿÿÿÿÿÿÿÿÿÿ | Attempt to seek file pointer error 

Attempt to seek file pointer error是正常的,因爲它代表試圖移動文件指針上的無效流時拋出異常。但是,ÿÿÿÿÿÿÿÿÿÿ不是正常的,也不是以固定大小的文件格式使用10或20字節來寫入數據。

創建文件的位置:

BinarySearchFile::BinarySearchFile(std::string file_name){ 

    // concatenate extension to fileName 
    file_name += ".dat"; 

    // form complete table data filename 
    data_file_name = file_name; 

    // create or reopen table data file for reading and writing 
    binary_search_file.open(data_file_name, std::ios::out | std::ios::in | std::ios::app); 

    if(!binary_search_file.is_open()){ 

     binary_search_file.clear(); 
     binary_search_file.open(data_file_name, std::ios::out); 
     binary_search_file.close(); 
     binary_search_file.open(data_file_name, std::ios::out | std::ios::in | std::ios::app); 
    } 

    try{ 
     if(binary_search_file.fail()){ 
      throw CustomException("Unspecified table data file error"); 
     } 
    } 
    catch (CustomException &custom_exception){ // Using custom exception class 
     std::cout << custom_exception.what() << std::endl; 
     return; 
    } 

} 

將數據寫入到文件

void BinarySearchFile::writeT(std::string attribute){ 
try{ 
    if(binary_search_file){ 
     for(auto start = attribute.begin(); start != attribute.end(); ++start){ 
      binary_search_file.put(' '); 
      binary_search_file.put(*start); 
     } 
     binary_search_file.flush(); 
     /* 
     attribute.resize(attribute.length() * 2); 
     const char *write_this = attribute.data(); 
     binary_search_file.write(write_this, attribute.length()); 
     */ 
    }else if(binary_search_file.fail()){ 
     throw CustomException("Attempt to write attribute error"); 
    } 

} 
catch(CustomException &custom_exception){ // Using custom exception class 
    std::cout << custom_exception.what() << std::endl; 
    return; 
} 
} 

讀取數據文件的位置:讀取該文件,並將結果打印到屏幕

std::string BinarySearchFile::readT(long file_pointer_location, long size_of_data) 
{ 
try{ 
    if(binary_search_file){ 

     std::string data = ""; 
     binary_search_file.seekp(file_pointer_location); 
     binary_search_file.seekg(file_pointer_location); 
     while (size_of_data > 0){ 
      binary_search_file.get(); 
      data += binary_search_file.get(); 
      size_of_data -= 2; 
     } 

     /* 
     char data[20]; 
     binary_search_file.seekp(filePointerLocation); 
     binary_search_file.seekg(filePointerLocation); 
     binary_search_file.read(data, sizeOfData); 
     */ 
     return data; 
    }else if(binary_search_file.fail()){ 
     throw CustomException("Attempt to read attribute error"); 
    } 

} 
catch(CustomException &custom_exception){ // Using custom exception class 
    std::cout << custom_exception.what() << std::endl; 
} 

} 

代碼:

while(true){ 

    //reinitialize the catalog pointer to the beginning 
    catalog->setPointerBegin(); 

    //display data 
    do{ 
     if (boost::iequals((domain = catalog->getAttributeDomain()), "string")){ 
      if(dataFile->binary_search_file_status()){ 
       std::cout << dataFile->read_data(filePointer, 20) << " | "; 
       if (!writer_.fail()) 
        writer_ << dataFile->read_data(filePointer, 20) << " | "; 
      } 
      else{ 
       std::cout << "\n"; 
       if (!writer_.fail()) 
        writer_ << "\n"; 

         return true; 
       } 
       // update the file pointer 
       filePointer += 20; 
       dataFile->set_file_pointer(filePointer); 
      } 
      else{ 
       if(dataFile->binary_search_file_status()){ 
        std::cout << dataFile->read_data(filePointer, 10); 
        if (!writer_.fail()) 
         writer_ << dataFile->read_data(filePointer, 10); 
        for(int i = 0; i < 5; i++){ 
          std::cout << " "; 
          if (!writer_.fail()) 
           writer_ << " "; 
         } 
         std::cout << " | "; 
         if (!writer_.fail()){ 
          writer_ << " | "; 
        } 
       } 
       else{ 
        std::cout << "\n"; 
        if (!writer_.fail()){ 
         writer_ << "\n"; 
        } 
        return true; 
       } 
       // update the file pointer 
       filePointer += 10; 

       }  


      } while(catalog->traverseForward() != nullptr); 

      std::cout << "\n"; 
      if (!writer_.fail()) 
       writer_ << "\n"; 

    } 

} 
+1

「ÿ」字符的字節值爲255 = 0xff。用十六進制編輯器打開文件,看它是否真的以10「ff」字節結尾。如果沒有(就像你和我所假設的那樣),你的閱讀程序中顯然會出現問題,例如,顯示未初始化的讀取緩衝區的字節,因爲您已超出文件結束並回收垃圾。 – 2013-05-03 20:34:10

+0

這個問題肯定是讀取例程跨越'EOF'並讀取直到流結束,但不會遇到'EOF'。 – Mushy 2013-05-06 12:16:17

回答

3

std::ifstream::get返回std::char_traits<char>::eof失敗,通常具有int-1。如果你把它理解爲一個有效的字符並且轉換爲char,那麼你會得到'\xff',這在ISO-8859-15中是ÿ

當您從文件中讀取字符時,尤其是在查找後,您應該檢查eof和/或eofbit