2013-04-03 162 views
-1

我是使用文件的初學者。我想在我的代碼中執行的操作是從用戶那裏獲得一個名稱,並將其隱藏在一個.bmp圖片中。並且還能夠從文件中再次獲取該名稱。但我想先將字符轉換爲ASCII碼(這是我的任務說)在C++中寫入和讀取二進制文件

我試圖做的是將名稱的字符更改爲ASCII碼,然後將它們添加到bmp圖片的末尾,我將以二進制模式打開。添加它們之後,我想從文件中讀取它們,並能夠再次獲取該名稱。

這是我迄今爲止所做的。但我沒有得到正確的結果。我得到的只是一些沒有意義的角色。這段代碼是對的嗎?

int main() 
{ 
    cout<<"Enter your name"<< endl; 
    char * Text= new char [20]; 
    cin>> Text; // getting the name 



    int size=0; 
    int i=0;  
    while(Text[i] !='\0')   
    { 

     size++; 
     i++; 

    } 



int * BText= new int [size]; 

for(int i=0; i<size; i++) 
{ 
    BText[i]= (int) Text[i]; // having the ASCII codes of the characters. 

} 


    fstream MyFile; 
MyFile.open("Picture.bmp, ios::in | ios::binary |ios::app"); 


    MyFile.seekg (0, ios::end); 
ifstream::pos_type End = MyFile.tellg(); //End shows the end of the file before adding anything 



    // adding each of the ASCII codes to the end of the file. 
    int j=0; 
while(j<size) 
{ 
    MyFile.write(reinterpret_cast <const char *>(&BText[j]), sizeof BText[j]); 
    j++; 
} 



MyFile.close(); 


char * Text2= new char[size*8]; 

MyFile.open("Picture.bmp, ios:: in , ios:: binary"); 


    // putting the pointer to the place where the main file ended and start reading from there. 

    MyFile.seekg(End); 
    MyFile.read(Text2,size*8); 



cout<<Text2<<endl; 


MyFile.close(); 

system("pause"); 
return 0; 

}

回答

5

許多缺陷是在你的代碼,一個重要的是:

MyFile.open("Picture.bmp, ios::in | ios::binary |ios::app"); 

必須

MyFile.open("Picture.bmp", ios::in | ios::binary |ios::app); 
      ^  ^
      |   | 
      +-----------+ 

 

二,使用std::string而不是C風格的字符串:

char * Text= new char [20]; 

應該

std::string Text; 

 

此外,使用std::vector做一個數組:

int * BText= new int [size]; 

應該

std::vector<int> BText(size); 

等等...

+0

我對std :: string和std :: vector沒有任何瞭解。到目前爲止,我學到的所有使用字符串的都是char數組形式。 –

+0

@PA:我強烈建議您閱讀並使用它們,使用它們有很多優點。 – deepmax

1

你寫int(這是32位),但讀char(這是8位)。

爲什麼不按原樣寫字符串?沒有必要將其轉換爲整數數組。你也不會終止你讀入的數組。

0

您的寫操作不正確,你應該通過完整的文本直接 MyFile.write(reinterpret_cast <const char *>(BText), sizeof (*BText));

此外,鑄造你的字符串,整數和回字符將插入你的角色之間的空間,你不考慮你的讀操作