前提・実現したいこと
バイナリファイルを読み込んで、テキストファイル形式に変換するプログラムを書いています。
例ですが、バイナリファイルの先頭から順に以下の要素を表しているとします。
・4byteは符号なし整数:Appleのサイズ
・4byteは符号なし整数:Appleの重さ
・64byteは符号なし文字:Appleの品種
処理の流れ
①読み込みファイルオープン
②バイナリファイルを内部クラスのメンバ変数に格納 ←ここを実施中
③ ②で格納した変数をシフト演算したり、16進数→10進数に変換処理
④ ③で変換した値をwrite関数でテキストファイルへ書き込む ←ここを実施中
今 解決したいこととして
内部クラスのメンバ変数にバイナリデータの値を格納し、
メインクラスのwiteメソッド(書き込み処理をするクラス)にて書き込み
処理を行いたいのですが、以下でエラーが出ます。
クラスの初期化が必要・・・のようですが、理解できず困っています。
ご教授いただければ幸いです。
発生している問題・エラーメッセージ
//ファイルに書き込む void MAIN::Write() OutFile << main.Size << endl; Run-Time Check Failure #3 - The variable 'datainfo_head' is being used without being initialized.
該当のソースコード
/*** メインクラス ** main.h ***/ class MAIN { //内部クラス public: class Apple; class Orange; //appleとおおよそ同じメンバ変数をもつが今は、除外 private: std::ifstream file; std::ofstream OutFile; public: bool INFile_Open(); bool INFile_Close(); void Read_Apple(); void Read_Orange(); bool OutFile_Open(); bool OutFile_Close(); void Write(); unsigned __int32 func_datahead(unsigned __int32 temp); // void Analysys();//データ解析 /* Apple */ class APPLE { public: unsigned __int32 Size; unsigned __int32 Weight; char Variety[64]; }; };
/* Apple.cpp */ #include<iostream> #include<fstream> #include<string> #include <sstream> #include<cstring> #include "main.h" using namespace std; /******* *******/ bool MAIN ::INFile_Open(char *FileName) { file.open(FileName, ios::in | ios::binary); cout << "FileName:" << FileName << endl;//取得ファイル名確認 Read_Apple(); return true; } // 16進数で格納 ビッグエンディアンになっている void MAIN::Read_Apple() { MAIN::APPLE apple; file.read((char*)&apple.Size,4); //例 0x 58 00 00 00 file.read((char*)&apple.Weight, 4); file.read(apple.Variety, 64); } bool MAIN ::INFile_Close() { file.close(); return 0; } bool MAIN ::OutFile_Open() { OutFile.open("C:\Users\Desktop\apple.txt", ios::out); Write(); return true; } bool MAIN ::OutFile_Close() { OutFile.close(); return 0; } //ファイルに書き込む void MAIN::Write() { MAIN::APPLE apple; OutFile << "APPLE DATA" << endl; cout << "aaa"; OutFile << apple.Size << endl; } //シフト演算関数 追加 unsigned __int32 MAIN::func_datahead(unsigned __int32 temp) { temp = (temp << 24) | ((temp << 8) & 0x00ff0000) | ((temp >> 8) & 0x0000ff00) | ((temp >> 24) & 0x000000ff); return temp; }
/*main.cpp*/ #include<iostream> #include<fstream> #include<string> #include "RouteDump.h" using namespace std; int main() { MAIN main; char FileName[200]; cout << "読み込みファイルを指定してください" << endl; cin >> FileName; if (main.INFile_Open(FileName)!=true) { cout <<"File Open Erorr!"<< endl; } if (main.OutFile_Close() != true) { cout << "File Open Erorr!" << endl; } main.InFile_Close(); main.OutFile_Close(); return 0; }
補足情報(FW/ツールのバージョンなど)
VIsualstudio2015 C++11以上
追記
2018/8/29追記
皆さん、回答ありがとうございます。
どうやら現時点の問題点は、Read_APPLE()でバイナリデータがapple.Sizeには取得できていて
Write()で書き出す際に、apple.Sizeに値が入っていない(例:0xcccccccc)というところまで分かりました。
しかし、どうして値がなくなるのか分からず・・・
ご教授頂けると幸いです。

回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/29 08:23