2017-05-08 17 views
-1

バイナリファイルから新しいchar配列にデータを正しく書き込む方法はありますか。 私はこの質問がここで何度か尋ねられたことを知っていますが、それでもそれを正しく行う方法を理解できませんでした。バイナリファイルからchar配列にデータを正しく読み込む方法

私はこれまで..

struct Computer_Details { 

     char computer_type[99]; 
     int release_year; 
     float price; 

    }; 


    Computer_Details pc_details; 

     cout << "Enter Computer Type: "; 
     cin.getline(pc_details.computer_type, 255); 
     cout << "Enter Computer Release Date: "; 
     cin >> pc_details.release_year; 
     cout << "Enter Computer Price: "; 
     cin >> pc_details.price; 
     cout << "\n\n"; 

     //Create File 
     ofstream file; 
     file.open("PC_Database.data", ios::binary | ios::app); 

     if (!file) cout << "Couldn't open file\n"; 
     else { 
     file.write((char*)&pc_details, sizeof(Computer_Details)); 
     file.close(); 
     } 


     ifstream readFile; 
     readFile.open("PC_Database.data", ios::binary); 
     if (!readFile) cout << "Couldn't Open File\n"; 
     else { 
     readFile.seekg(0, ios::end); 
     int fileSize = readFile.tellg(); 
     int pcCount = fileSize/sizeof(Computer_Details); 

     readFile.seekg(0, ios::beg); 
     Computer_Details *pc_details = new Computer_Details[pcCount]; 
     readFile.read((char*)pc_details, pcCount * sizeof(Computer_Details)); 

     char *buff = new char[299]; 

     for (int i = 0; i < pcCount; i++) 
     { 
      //write to buff char 
     } 
     readFile.close(); 
    } 
+0

['strcpy'](http://en.cppreference.com/w/cpp/string/byte/strcpy)を使用することができます。 –

+2

[バイナリファイルをC++のchar配列に読み込む]の重複が考えられます(http://stackoverflow.com/questions/33935567/reading-binary-file-into-char-array-in-c) – didiz

+2

この回答は役に立ちませんでした。 – Andrew

答えて

0

を試してみて、この構造体の大きさと比較したものを、この:

struct Computer_Details { 
     char computer_type[100]; 
     int release_year; 
     float price; 
    }; 

同じ問題は、読み書きしようとしている構造体intのような他の2つの型の間のns bool変数。

このお試しください:私の推測では、あなたがどこかに送信し、データを再構築することができるようにバフにpc_detailsを突き出すしたいということですhttps://stackoverflow.com/a/119128/7981164

0

おそらく問題は、あなたの構造の大きさ、構造用 チェックサイズがある

std::ifstream input(szFileName, std::ios::binary); 
data = std::vector<char>(std::istreambuf_iterator<char>(input), 
    (std::istreambuf_iterator<char>())); 
char* charArray = &data[0]; 
size_t arraySize = data.size(); 
+2

なぜでしょうか?あなたがしたこととその理由を説明してください。 – user4581301

+0

'data'ベクターのバッファは必要な文字配列です。そのコンストラクタの引数は2つのイテレータです。 2番目のコンストラクタはデフォルトであり、 'end'イテレータとして扱われます。 – Oliort

0

readFile.read((char*)pc_details->computer_type, sizeof(Computer_Details::computer_type)); 
readFile.read((char*)pc_details->release_year, sizeof(Computer_Details::release_year)); 
readFile.read((char*)pc_details->price, sizeof(Computer_Details::price)); 

編集:このコメントの例を見て。これを行う際に

for(int i=0; i < pcCount; i++) 
{ 
    memcpy(buff, (char*)pc_details, sizeof(computer_details)); 
    buff += sizeof(computer_details); 
    pc_details++; 
} 

は、しかし、あなたはアライメントに留意する必要がありますし、それに応じて パディングを提供します。その場合は

、あなたはこれを行うことができます。そしてあなたのコードはあなたの配列境界をチェックするべきです。

関連する問題