はじめまして。
今回はじめてC++のバイナリファイルを扱いうまくいかないので
ご指摘などをお願いします。
void writeFile(){
short data_s=0;
int data_i=0;
char* data_c="a";
double data_d=0;
std::ofstream outputFile("maninfo.dat", std::ios::app | std::ios::binary);
// for(int i = 0; i < 100; i++){
cout << "short型の数値を入力してください==> ";
cin >> data_s;
cout << "int型の数値を入力してください==> ";
cin >> data_i;
cout << "double型の数値を入力してください==>";
cin >> data_d;
cout << "文字列を入力して下さい==>";
cin >> data_c;
outputFile.write((char*)&data_s,sizeof(short));
outputFile.write((char*)&data_i,sizeof(int));
outputFile.write((char*)&data_c,sizeof(char)*Max_Name);
outputFile.write((char*)&data_d,sizeof(double));
// }
outputFile.close();
}
void readFile(){
std::ifstream inputFile("maninfo.dat", std::ios::in | std::ios::binary);
int count =0;
short data_s=0;
int data_i=0;
char* data_c="a";
double data_d=0;
// for(int i = 0; i < 100; i++){
while(!inputFile.eof()){
inputFile.read((char*)&data_s,sizeof(short));
inputFile.read((char*)&data_i,sizeof(int));
inputFile.read((char*)&data_c,sizeof(char)*Max_Name);
inputFile.read((char*)&data_d,sizeof(double));
cout << (count + 1) << "件目" << endl;
cout << "short : " << data_s << endl;
cout << "int : " << data_i << endl;
cout << "char* : " << data_c << endl;
cout << "double: " << data_d << endl << endl;
count++;
}
inputFile.close();
}
void main()
{
// newfile();
writeFile();
readFile();
}
これを実行したところ
・最初のデータを登録すると、同じデータが2件表示される。
・また2件目のデータを登録すると、2件目のchar*型の部分が
1件目のchar*の部分に上書きされてしまう。
・char* data_c="a";など初期に何か文字を設定しないと、プログラムが実行時にとまってしまう。
以上の事が起こります。
C++をはじめて1週間と日が浅く、わからないことだらけです。
初心者的質問かもしれませんが、是非ご指導お願いします。
short/int/doubleはともかく、char*をファイルに書いても意味がない。
書かねばならないのは、char*が示す先にある文字列。
void writeFile
{
> char* data_c = "a";
char data_c[Max_Name] = "";
....
> outputFile.write((char*)&data_c, sizeof(char)*Max_Name);
outputFile.write(data_c, sizeof(char)*Max_Name);
}
あんまりコード変更したくないなら上記のように変更すればいいかもぉ。
あと、ファイルを開いたら開けたかどうかの確認をした方がよろしいかと思います。
επιστημηさん
>>short/int/doubleはともかく、char*をファイルに書いても意味がない。
確かに、char型にchar型をキャストしても意味ないですねw
hurutaniさん
>>あんまりコード変更したくないなら上記のように変更すればいいかもぉ。
あと、ファイルを開いたら開けたかどうかの確認をした方がよろしいかと思います。
間違えて送信おしてしまったので^^;
επιστημηさん
>>short/int/doubleはともかく、char*をファイルに書いても意味がない。
確かに、char型にchar型をキャストしても意味ないですねw
hurutaniさん
>>あんまりコード変更したくないなら上記のように変更すればいいかもぉ。
>>あと、ファイルを開いたら開けたかどうかの確認をした方がよろしいかと思います。
お二人様、とても貴重なアドバイスありがとうございました。
お二人のいった部分を変更したらきちんと動きました。
本当にありがとうございました。
>>>short/int/doubleはともかく、char*をファイルに書いても意味がない。
> 確かに、char型にchar型をキャストしても意味ないですねw
ぅぅぅ…解ってないよ orz
ポインタ値をファイルに書くってことは、
ファイルの中にはたとえば "48CA番地" と書いてあるわけや。
それを読み出したところで
「文字列は以前48CA番地にありました」
ってことがわかるだけでしょが。
給料もらって、給料袋'だけ'銀行に預けてどうするよ。
ツイート | ![]() |