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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

3回答

2036閲覧

fwrite fread した時値が異なる

Lizard_knight

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/07/12 16:08

編集2019/07/13 01:46

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

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

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

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

該当のソースコード

c

1#include <iostream> 2#include <stdio.h> 3#include <stdlib.h> 4#include <string.h> 5 6//#define debug 7//#define aaa 8using namespace std; 9 10int depred_interframe(const char *inname, const char *outname) 11{ 12 short int buf; 13 FILE *infp, *outfp; 14 infp=fopen(inname,"rb"); 15 if(infp==NULL){ 16 perror("input file open error"); 17 exit(-1); 18 } 19 outfp=fopen(outname,"wb"); 20 if(outfp==NULL){ 21 perror("output file open error"); 22 exit(-1); 23 } 24 25 short int **matrix, *base_matrix; 26 int frame=622, channel=512, winsize=7; 27 int tmp=channel*winsize*winsize; 28 29 matrix=(short int**)calloc(sizeof(short int *),frame); 30 base_matrix=(short int*)calloc(sizeof(short int),frame*tmp); 31 for(int i=0;i<frame;i++){ 32 matrix[i] = base_matrix+i*tmp; 33 } 34 35 int num=0; 36 for(int i=0;i<frame;i++){ 37 for(int j=0;j<tmp;j++){ 38 fread(&buf,2,1,infp); 39 matrix[i][j]=buf; 40 if (buf>0){ 41 num++; 42 } 43#ifdef aaa 44 if((j+1)%49==0){ 45 printf("%3d\n\n", matrix[i][j]); 46 }else if((j+1)%7==0){ 47 printf("%3d\n", matrix[i][j]); 48 }else{ 49 printf("%3d ", matrix[i][j]); 50 } 51#endif 52 } 53 } 54 printf("%d\n", num); 55 56 fclose(infp); 57 fclose(outfp); 58} 59 60 61int pred_interframe(const char *inname, const char *outname) 62{ 63 unsigned char buf; 64 FILE *infp, *outfp; 65 infp=fopen(inname,"rb"); 66 if(infp==NULL){ 67 perror("input file open error"); 68 exit(-1); 69 } 70 outfp=fopen(outname,"wb"); 71 if(outfp==NULL){ 72 perror("output file open error"); 73 exit(-1); 74 } 75 76 unsigned char **matrix, *base_matrix; 77 int frame=622, channel=512, winsize=7; 78 int tmp=channel*winsize*winsize; 79 80 matrix=(unsigned char**)calloc(sizeof(unsigned char *),frame); 81 base_matrix=(unsigned char*)calloc(sizeof(unsigned char),frame*tmp); 82 for(int i=0;i<frame;i++){ 83 matrix[i] = base_matrix+i*tmp; 84 } 85 86 for(int i=0;i<frame;i++){ 87 for(int j=0;j<tmp;j++){ 88 fread(&buf,1,1,infp); 89 matrix[i][j]=buf; 90#ifdef debug 91 if((j+1)%49==0){ 92 printf("%3d\n\n", matrix[i][j]); 93 }else if((j+1)%7==0){ 94 printf("%3d\n", matrix[i][j]); 95 }else{ 96 printf("%3d ", matrix[i][j]); 97 } 98#endif 99 } 100 } 101 102 unsigned char *pre_frame,*lat_frame; 103 int num=0; 104 105 for(int i=0;i<frame;i++){ 106 pre_frame=matrix[i-1]; 107 lat_frame=matrix[i]; 108 for(int j=0;j<tmp;j++){ 109 short int y; 110 if(i==0){ 111 y=matrix[i][j]; 112 if(y>0){num++;} 113 fwrite(&y,2,1,outfp); 114 }else{ 115 //printf("pre : %d, lat : %d\n", pre_frame[j], lat_frame[j]); 116 //printf("diff : %d\n", pre_frame[j]-lat_frame[j]); 117 y=pre_frame[j]-lat_frame[j]; 118 if(y>0){num++;} 119 fwrite(&y,2,1,outfp); 120 } 121 } 122 } 123 printf("%d\n", num); 124 125 fclose(infp); 126 fclose(outfp); 127} 128 129int main(void){ 130 //char inname[100] = "./input.txt"; 131 pred_interframe("input.txt","output.bin"); 132 depred_interframe("output.bin","output.bin"); 133 134 return 0; 135} 136

試したこと

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

投稿2019/07/13 02:28

fana

総合スコア11652

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ちょっと見ですが・・・

short int buf;

unsigned char buf;

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

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

投稿2019/07/12 17:33

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lizard_knight

2019/07/13 01:49

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

0

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

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

C

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

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

投稿2019/07/12 16:33

編集2019/07/13 03:49
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lizard_knight

2019/07/13 01:45

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

2019/07/13 03:28

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問