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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。