C言語プログラミングの壁を突破!ファイル操作のエラー解決と、キャリアアップへの道
C言語プログラミングの壁を突破!ファイル操作のエラー解決と、キャリアアップへの道
この記事では、C言語プログラミングにおけるファイル操作のエラーに焦点を当て、具体的な解決策を提示します。特に、ファイルから特定のバイト数を読み込み、別のファイルに書き出すプログラムで発生する問題について、詳細な解説を行います。さらに、プログラミングスキルを活かしてキャリアアップを目指すためのヒントも提供します。
自分でも原因がわからないエラーが出ています。C言語にお詳しい方、助けてください。既存のファイルから任意バイトのデータを仕事の位置から読み出し、別名のファイルに書き出すプログラムを作成し、その結果を別のプログラムで「ファイルをバイナリ・モードで開き、内容を16進数で表示させる」というものです。
ちなみに、「ファイルをバイナリ・モードで開き、内容を16進数で表示させる」プログラムはまったく問題ありません。
既存のファイルから5000バイト番目から200バイトを書き出し、バイナリ・モードで開き、内容を16進数で表示させる際、なぜか200バイトと指定したにもかかわらず、51バイト分(16進数の数字が51個)しか表示されません。その原因がわからず困っています。修正とその原因を教えてください。
以下にプログラムを記載します。
#include<stdio.h>
int main(){
FILE *fin, *fout;
char fnint[30],fnout[30],buff[200]="";
int s,g;
//~操作情報の受け取り~//
printf("既存のファイルを入力してください>");
scanf("%s",fnint);
printf("書き込むファイルを入力してください>");
scanf("%s",fnout);
printf("読み出す開始の位置を指定してください>");
scanf("%d",&s);
printf("読み出すバイトのデータを入力してください>");
scanf("%d",&g);
//~既存ファイルのオープン~//
if((fin=fopen(fnint,"rb")) == NULL){
printf("ファイルオープンエラー%sn",fnint);
return 1;
}
//~書き込むファイルをオープン~//
if((fout=fopen(fnout,"wb")) == NULL){
printf("ファイルオープンエラー%sn",fnout);
return 2;
}
fseek(fin,s-1,SEEK_SET);//読み込む場所を指定するためにfseekを使用//SEEK_SETはファイルの先頭へ移動
fread(buff,1,g,fin);//freadで指定したバイト分読み込む
fprintf(fout,buff);//文字列 buff で指定した書式で fout = fopen()でオープンしたファイルにデータを書き込む。
fclose(fin);
fclose(fout);
return (0);
}
エラーの原因と解決策
ご質問ありがとうございます。C言語でのファイル操作に関する問題ですね。プログラムの動作がおかしい原因を特定し、修正点と合わせて解説していきます。
1. 問題の特定
問題は、fread関数で読み込むバイト数を200バイトと指定したにもかかわらず、実際には51バイト分しか読み込まれないという点です。これは、fprintf関数でbuffの内容を書き出す際に、意図したデータがすべて書き出されていないことが原因であると考えられます。
2. 修正点
問題の根本原因は、fprintf関数が文字列の終端文字(