2017-03-06 5 views
0

ユーザーが文字列を入力できるファイルベースのプログラムを作成しようとしています。プログラムはメインディレクトリの.binファイルに保存します。コンソール出力の最初の文字がC++ fread文字列にありません

これは私が現在持っているものです:

.binファイルの先頭で
#include <ostream> 
#include <string> 
#include <cstdio> 
#include <iostream> 

using std::string; 
using std::cout; 

class Ingredient { 
private: 
    FILE *file; 
    string name; 
    int nmLen; 
    float calories; 
    float fat; 
    float carb; 
    float protein; 
    float fiber; 
    void writeInfo() { 
     nmLen = sizeof(name); 
     std::fseek(file, 0, SEEK_SET); 
     std::fwrite(&nmLen, sizeof(int), 1, file); 
     std::fwrite(&name, sizeof(name), 1, file); 
     nmLen = 0; 
     name = ""; 
    } 
    string readInfo() { 
     std::fseek(file, 0, SEEK_SET); 
     std::fread(&nmLen, sizeof(int), 1, file); 
     std::fread(&name, nmLen, 1, file); 
     return name; 
    } 
public: 
    Ingredient(const string &nm, const float &cal, const float &cb, const float &prot, const float &fib) { 
     file = std::fopen((nm+".bin").c_str(), "rb+"); 
     name = nm; 
     calories = cal; 
     carb = cb; 
     protein = prot; 
     fiber = fib; 
     if (file == nullptr) { 
      file = fopen((nm+".bin").c_str(), "wb+"); 
      writeInfo(); 
      cout << readInfo() << "\n"; 
     } 
     else { 
      writeInfo(); 
      cout << readInfo() << "\n"; 
     } 
    } 
}; 

int main() { 
    string v1 = "Really Long String Here"; 
    float v2 = 1.0; 
    float v3 = 2.0; 
    float v4 = 3.0; 
    float v5 = 4.0; 
    Ingredient tester(v1, v2, v3, v4, v5); 
} 

私が格納されている文字列の長さや大きさを示すためにint型を格納し、私は関数freadを呼び出すときに、それが全体を取ります文字列。文字列をファイルに書き込むかどうかをテストしようとすると、適切に返されます。しかし、私は自分のコンストラクタからのコンソール出力から取得することはこれです:

eally Long String Here 

注文字「R」を印刷しているはずの空白スペースが実際に存在していること。これはおそらく、私が正しく見ていないという事実のためですか?

+0

を必要としています。 –

+0

最初の質問 - ファイルに正しいデータが入っていますか? – pm100

+0

このように 'string'をシリアライズ/デシリアライズすることはできません。 –

答えて

2

確かに間違っています。std::fwrite(&name, sizeof(name), 1, file);

あなたはどのような種類の読み出し動作を実行するたびに、あなたは常に読み取りが成功したことを確認して、何とか任意の失敗を処理しなければなりません

std::fwrite(name.c_str(), name.length(), 1, file); 
関連する問題