2013-01-18 123 views
0

我開發了一個C++應用程序,用於在隨機訪問文件上讀取和寫入數據。 (我使用Visual C++ 2010)閱讀隨機訪問文件

這裏是我的程序:

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


using namespace std; 
class A 
{ 
public : 
    int a; 
    string b; 
    A(int num , string text) 
    { 
     a = num; 
     b = text; 
    } 
}; 

int main() 
{ 
    A myA(1,"Hello"); 
    A myA2(2,"test"); 

    cout << "Num: " << myA.a<<endl<<"Text: "<<myA.b<<endl; 

    wofstream output; //I used wfstream , becuase I need to wite a unicode file 
    output.open("12542.dat" , ios::binary); 
    if(! output.fail()) 
    { 
     output.write((wchar_t *) &myA , sizeof(myA)); 
     cout << "writing done\n"; 
      output.close(); 

    } 
    else 
    { 
     cout << "writing failed\n"; 
    } 


    wifstream input; 
    input.open("12542.dat" , ios::binary); 
    if(! input.fail()) 
    { 
    input.read((wchar_t *) &myA2 , sizeof(myA2)); 
    cout << "Num2: " << myA2.a<<endl<<"Text2: "<<myA2.b<<endl; 
    cout << "reading done\n"; 
    } 

    else 
    { 
     cout << "reading failed\n"; 
    } 

    cin.get(); 
} 

和輸出是:

Num: 1 
Text: Hello 
writing done 
Num2: 1 
Text2: test 
reading done 

但我希望Text2: Hello。 有什麼問題?

順便說一句,我如何在我的課程內(在一個函數中)output.write

感謝

+5

您不能讀寫非字節流中的非POD結構。你的'A'包含一個不是POD的'std :: string',因此'A'不是POD。另外,讀取可能會失敗。 –

+0

我忘了在這裏寫下我的preprosecor命令......編輯的問題。 – Arashdn

+0

@Seth Carnegie,我能做些什麼來在文件中寫字符串? – Arashdn

回答

1

A不POD,你不能粗暴地投非POD對象char*然後寫入流。 需要序列A,例如:

class A 
{ 
public : 
    int a; 
    wstring b; 
    A(int num , wstring text) 
    { 
     a = num; 
     b = text; 
    } 
}; 

std::wofstream& operator<<(std::wofstream& os, const A& a) 
{ 
    os << a.a << " " << a.b; 
    return os; 
} 

int main() 
{ 
    A myA(1, L"Hello"); 
    A myA2(2, L"test"); 

    std::wcout << L"Num: " << myA.a<<endl<<L"Text: "<<myA.b<<endl; 

    wofstream output; //I used wfstream , becuase I need to wite a unicode file 
    output.open(L"c:\\temp\\12542.dat" , ios::binary); 
    if(! output.fail()) 
    { 
     output << myA; 
     wcout << L"writing done\n"; 
     output.close(); 
    } 
    else 
    { 
     wcout << "writing failed\n"; 
    } 

    cin.get(); 
} 

此示例對象序列化到妙文件,你可以想想如何讀出來。

+0

即使是大多數POD也存在問題。你通常必須定義一個格式,然後編寫它。 (有一個原因,爲什麼'istream :: read'和'ostream :: write'採用'char *',而不是'void *'。) –

+0

感謝您的回覆 - 但我無法理解您如何包含寫入函數裏面的課... – Arashdn

+0

@Arashdn哪一個你不明白? – billz