バイナリファイルの入出力

解決


エルΣ(・ω・`)  2005-09-15 03:16:51  No: 59013

はじめまして。
今回はじめて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週間と日が浅く、わからないことだらけです。
初心者的質問かもしれませんが、是非ご指導お願いします。


επιστημη  2005-09-15 07:20:27  No: 59014

short/int/doubleはともかく、char*をファイルに書いても意味がない。
書かねばならないのは、char*が示す先にある文字列。


hurutani  2005-09-15 09:56:48  No: 59015

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);
}
あんまりコード変更したくないなら上記のように変更すればいいかもぉ。
あと、ファイルを開いたら開けたかどうかの確認をした方がよろしいかと思います。


エルΣ(・ω・`)  2005-09-15 18:04:54  No: 59016

επιστημηさん
>>short/int/doubleはともかく、char*をファイルに書いても意味がない。
確かに、char型にchar型をキャストしても意味ないですねw

hurutaniさん
>>あんまりコード変更したくないなら上記のように変更すればいいかもぉ。
あと、ファイルを開いたら開けたかどうかの確認をした方がよろしいかと思います。


エルΣ(・ω・`)  2005-09-15 18:06:48  No: 59017

間違えて送信おしてしまったので^^;
επιστημηさん
>>short/int/doubleはともかく、char*をファイルに書いても意味がない。
確かに、char型にchar型をキャストしても意味ないですねw

hurutaniさん
>>あんまりコード変更したくないなら上記のように変更すればいいかもぉ。
>>あと、ファイルを開いたら開けたかどうかの確認をした方がよろしいかと思います。

お二人様、とても貴重なアドバイスありがとうございました。
お二人のいった部分を変更したらきちんと動きました。
本当にありがとうございました。


επιστημη  2005-09-15 19:08:39  No: 59018

>>>short/int/doubleはともかく、char*をファイルに書いても意味がない。
> 確かに、char型にchar型をキャストしても意味ないですねw

ぅぅぅ…解ってないよ orz

ポインタ値をファイルに書くってことは、
ファイルの中にはたとえば "48CA番地" と書いてあるわけや。
それを読み出したところで
「文字列は以前48CA番地にありました」
ってことがわかるだけでしょが。

給料もらって、給料袋'だけ'銀行に預けてどうするよ。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加