在C++中读取和写入文件

问题描述:

我正在尝试将三重矢量写入文件,然后才能够读回数据结构。当我试图在保存后读取文件时,前五十个值出来正确,但剩下的值是垃圾。如果有人能够帮助我,我会非常感激。非常感谢!在C++中读取和写入文件

文件声明:

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; 
       } 
      } 
    } 
} 
+0

三矢量的维数是多少? – 2010-01-08 17:27:35

既然你写的二进制数据(和Windows下的工作显然)你真的需要在打开fstream时指定ios :: binary。

+0

将声明更改为 fstream memory_file(“C:\\ Users \\ Amichai \\ Pictures \\ output.txt”,ios :: in | ios :: out | ios :: binary); 它应该工作 – anijhaw 2010-01-08 17:26:28

问题是您正在将数值以二进制形式写入流处理器将其解释为文本的文件。在写入文件之前,使用二进制文件(使用ios :: binary)或将数字转换为字符串。

查看Boost.Serialization库www.booost.org。它知道如何读写文件中的STL集合。不过,我不知道它是否可以处理嵌套容器。

您可能还想为您的三维数据使用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 :: Serilization库。