質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.06%

fwrite fread した時値が異なる

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 687

score 18

fwriteした後の値とfreadした時の値を一致させたい

ある配列をbainry保存した後に、binaryファイルを読み込み、値を確認すると正しくないことが判明しました。
c言語のbinary保存について誰か教えて下さい!

発生している問題・エラーメッセージ

fwrite時のnum>0の個数:928568
fread時のnum>0の個数:0

該当のソースコード

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//#define debug
//#define aaa
using namespace std;

int depred_interframe(const char *inname, const char *outname)
{
  short int buf;
  FILE *infp, *outfp;
  infp=fopen(inname,"rb");
  if(infp==NULL){
    perror("input file open error");
    exit(-1);
  }
  outfp=fopen(outname,"wb");
  if(outfp==NULL){
    perror("output file open error");
    exit(-1);
  }

  short int **matrix, *base_matrix;
  int frame=622, channel=512, winsize=7;
  int tmp=channel*winsize*winsize;

  matrix=(short int**)calloc(sizeof(short int *),frame);
  base_matrix=(short int*)calloc(sizeof(short int),frame*tmp);
  for(int i=0;i<frame;i++){
    matrix[i] = base_matrix+i*tmp;
  }

  int num=0;
  for(int i=0;i<frame;i++){
    for(int j=0;j<tmp;j++){
      fread(&buf,2,1,infp); 
      matrix[i][j]=buf;
      if (buf>0){
        num++;
      }
#ifdef aaa
      if((j+1)%49==0){
        printf("%3d\n\n", matrix[i][j]);
      }else if((j+1)%7==0){
        printf("%3d\n", matrix[i][j]);
      }else{
        printf("%3d ", matrix[i][j]);
      }
#endif
    }
  }
  printf("%d\n", num);

  fclose(infp);
  fclose(outfp);
}


int pred_interframe(const char *inname, const char *outname)
{
  unsigned char buf;
  FILE *infp, *outfp;
  infp=fopen(inname,"rb");
  if(infp==NULL){
    perror("input file open error");
    exit(-1);
  }
  outfp=fopen(outname,"wb");
  if(outfp==NULL){
    perror("output file open error");
    exit(-1);
  }

  unsigned char **matrix, *base_matrix;
  int frame=622, channel=512, winsize=7;
  int tmp=channel*winsize*winsize;

  matrix=(unsigned char**)calloc(sizeof(unsigned char *),frame);
  base_matrix=(unsigned char*)calloc(sizeof(unsigned char),frame*tmp);
  for(int i=0;i<frame;i++){
    matrix[i] = base_matrix+i*tmp;
  }

  for(int i=0;i<frame;i++){
    for(int j=0;j<tmp;j++){
      fread(&buf,1,1,infp); 
      matrix[i][j]=buf;
#ifdef debug
      if((j+1)%49==0){
        printf("%3d\n\n", matrix[i][j]);
      }else if((j+1)%7==0){
        printf("%3d\n", matrix[i][j]);
      }else{
        printf("%3d ", matrix[i][j]);
      }
#endif
    }
  }

  unsigned char *pre_frame,*lat_frame;
  int num=0;

  for(int i=0;i<frame;i++){
    pre_frame=matrix[i-1];
    lat_frame=matrix[i];
    for(int j=0;j<tmp;j++){
      short int y;
      if(i==0){
        y=matrix[i][j];
        if(y>0){num++;}
        fwrite(&y,2,1,outfp);
      }else{
        //printf("pre : %d, lat : %d\n", pre_frame[j], lat_frame[j]);
        //printf("diff : %d\n", pre_frame[j]-lat_frame[j]);
        y=pre_frame[j]-lat_frame[j];
        if(y>0){num++;}
        fwrite(&y,2,1,outfp);
      }
    }
  }
  printf("%d\n", num);

  fclose(infp);
  fclose(outfp);
}

int main(void){
  //char inname[100] = "./input.txt";
  pred_interframe("input.txt","output.bin");
  depred_interframe("output.bin","output.bin");

  return 0;
}

試したこと

matrixのまま保存してみましたが、値は0値ばかりになり正しく保存できませんでした。

補足情報(FW/ツールのバージョンなど)

g++-5 (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

depred_interframe()の方はnumが0初期化されていないため不定値が入っているのでは?

(追記)
すみません、VCではfopenは排他オープンになるため
動作確認の際
depred_interframe()の

 outfp=fopen(outname,"wb");
  if(outfp==NULL){
    perror("output file open error");
    exit(-1);
  }


を消して確認していました。
”wb”を指定してfopen()しているので上書きオープンされ、ファイルが0バイトになっていますよ。
上記の不要なfopen()を消せば一致すると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/13 10:45

    num=0;で初期化してみたところ、
    fwrite時のnum>0の個数:928568
    fread時のnum>0の個数:0
    となりました。結局の所、fwriteが正しくできてない感じです。

    キャンセル

  • 2019/07/13 12:28

    こちらでは一致しましたが…

    キャンセル

0

ちょっと見ですが・・・

short int buf;
unsigned char buf;

この違いはなぜでしょう?

shortとcharではバイト並びが違いますよd^^

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/13 02:39

    参考:バイトオーダ - ビッグエンディアン/リトルエディアン
    http://www.ertl.jp/~takayuki/readings/info/no05.html

    キャンセル

  • 2019/07/13 10:49

    pred_interframe()関数では、unsigned char型をfreadで読み込んで、計算結果で負の値が現れるのでshort intで宣言したyをoutput.binで保存しました。
    そのoutput.binを読み込むに当たり、short int buf;を使ってfreadしているためです。

    キャンセル

0

depred_interframeのoutfpは何のために存在しているのですか?
読み取り対象と同一のファイルであるoutput.binを書き込みモードで開いてしまっているのがまずいのかも?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る