簡體   English   中英

用C ++讀寫文件

[英]Reading and writing to a file in c++

我正在嘗試將三元向量寫入文件,然后能夠再讀回數據結構。 當我嘗試在保存文件后回讀該文件時,前50個值正確無誤,但其余的值都是垃圾。 如果有人可以在這里幫助我,我將不勝感激。 非常感謝!

文件聲明:

    fstream memory_file("C:\\Users\\Amichai\\Pictures\\output.txt", ios::in | ios::out);    

保存功能:

void save_training_data(fstream &memory_file, vector<vector<vector<long double> > > &training_data)
 {
   int sizeI = training_data.size();
   memory_file.write((const char *)&sizeI, sizeof(int));
   for (int i=0; i < sizeI; i++)
   {
       int sizeJ = training_data[i].size();
       memory_file.write((const char *)&sizeJ, sizeof(int));
       for (int j=0; j < sizeJ; j++) 
       {
           int sizeK = training_data[i][j].size();
           memory_file.write((const char *)&sizeK, sizeof(int));
           for (int k = 0; k < sizeK; k++)
           {
               int temp;
               temp = (int)training_data[i][j][k];
               memory_file.write((const char *)&temp, sizeof(int));
           }
       }
   } 
 }

讀取功能:

void upload_memory(fstream &memory_file, vector<vector<vector<long double> > > &training_data)
{
     memory_file.seekg(ios::beg);
     int temp=0;
     int sizeK, sizeJ, sizeI; 
     memory_file.read((char*)&sizeI, sizeof(int));
     training_data.resize(sizeI);
     for (int i=0; i < sizeI; i++)
     {
           memory_file.read((char*)&sizeJ, sizeof(int));
           training_data[i].resize(sizeJ);           
           for (int j=0; j < sizeJ; j++)
           {
               memory_file.read((char*)&sizeK, sizeof(int));
               training_data[i][j].resize(sizeK);
               for (int k = 0; k < sizeK; k++)
               {
                    memory_file.read((char*)&temp, sizeof(int));
                    training_data[i][j][k]=temp;
               }
           }
     } 
}

由於您正在編寫二進制數據(並且顯然在Windows下工作),因此在打開fstream時,確實需要指定ios :: binary。

問題是您正在將二進制形式的數值寫入流處理器解釋為文本的文件中。 在寫入文件之前,請使用二進制文件(使用ios :: binary)或將數字轉換為字符串。

www.booost.org上檢查Boost.Serialization庫。 它知道如何讀寫文件中的STL集合。 不過,我不知道它是否可以處理嵌套容器。

您可能還想對3維數據使用Boost.Multiarray。 如果要對數據進行矩陣數學運算,則可能要使用Boost.uBlas。

其他答案建議使用“ ios :: in | ios :: out | ios :: binary”代替“ ios :: in | ios :: out”,這是正確的,但是我記得在閱讀C ++流規范的同時二進制選項根本不是為二進制文件設計的。 如果使用“ ios :: binary”無濟於事,則您需要使用stdio.h的C函數fopen(),fread(),fwrite()和fclose(),或者按照另一個用戶的建議使用Boost ::序列化庫。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM