• ベストアンサー

C/C++ ファイル入出力操作 (長文です。)

C/C++歴4ヶ月の初心者プログラマーです。現在、 C/C++でのファイル入出力で大変困っております。 その内容というのはファイルをオープンし指定した テキストファイルに書き込む時に制限をかけたいのです。 例えば、 ファイルに書き込む内容が50行を超えた場合 1番始めに書き込まれた1行目の内容を削除して、 2行目~50行目のデータを1行繰上げて、最新のデータを 50行目に書き込んでいく処理をしたいのですが僕一人では 全くわからず先に進めない状態です。どなたかわかる方 おられますか?よろしければご伝授してください。 途中までのソースを載せておきますので宜しくお願いいたします。 Cで書いていますがC++でも方法があればお願いいたします。 /****************************** サンプルソース ******************************/ #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fp //ファイルポインタの宣言 char str[] = "テスト書き込み"; if((fp=("test.txt","w"))==NULL) //ファイルオープン { exit(1); //ファイルオープンエラー時 } //ここの処理がわかりません。50行まできたら1行目を削除し //2行目~50行目を1行繰上げ、最新データを50行目に書き込み fprintf(fp,"%s\n", str); fclose(); }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

BlueStonesです。補足質問に対する回答です。 ---------------------------------------------------------------- // 一行毎に入力する場合 while(1) {  // 一時保存用変数  char buf[ 256 ];  // 文字列の入力  gets( buf );  // 何も入力せずにEnterキーを押した場合は入力終了  if( strcmp( buf, "" ) == 0 )   break;  // Data変数に格納  strcpy( Data[ num ], buf );  num++; } ---------------------------------------------------------------- // ファイルにすでに入っているデータを参照する場合 // 注) // このプログラムは // if( (fp = fopen("test.txt","w")) == NULL ) // の記述よりも前に宣言してください // ファイルオープン(読み込み用) if( (fp = fopen("test.txt","r")) == NULL ) {  exit(1); } // ファイルの終わりが来るまで読み込み while( !feof( fp ) ) {  char *p;  // 一行の読み込み  fgets( Data[ num ], 256, fp );  // fgets()は末尾の改行も代入されるので、それを除去  p = strrchr( Data[ num ], '\n' );  if( p != NULL )  {   *p = '\0';  }  // 行数のカウント  num++; } // 最後の行が改行のみなら、それは無視する if( strcmp( Data[ num - 1 ], "" ) == 0 ) {  num--; } // ファイルクローズ fclose( fp ); ---------------------------------------------------------------- こんなのを考えてみましたが どうでしょうか(^_^)

ko-web
質問者

お礼

早速の回答ありがとうございます。こんな難しい処理をスラスラと 記述できるなんて本当にすごいし、羨ましいです。まだこの素晴らしい ソースを見て理解するには少々時間が掛かりそうですがゆっくり解析 していきたいと思います。BlueStones本当にこんな初心者の 悩みを聞いていただき感謝しています。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

回答No.4

前提としてファイルのデータ内容が 変数に保存されているとした場合のプログラムを書いてみました。 ---------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) {  FILE *fp;  char str[] = "テスト書き込み";  char Data[ 64 ][ 256 ]; // 64行分の文字列が格納できる変数  int num = 0;  int i;  // ファイルオープン  if( (fp = fopen("test.txt","w")) == NULL )  {   exit(1);  }  /*   このコメント欄内には    Data変数に書き込み文字列を代入する処理   を記述する  */  // 書き込み文字列が50行以上のときの処理  if( num >= 50 )  {   // 繰上げる行数の計算   int shift = (num - 50) + 1;   // 下から49行分を繰上げ   memcpy( Data[ 0 ], Data[ shift ], 256 * 49 );   // 最新データを50行目に代入   strcpy( Data[ 49 ], str );   num = 50;  }  // 通常のデータの代入  else  {   // 最新データを代入   strcpy( Data[ num ], str );   num++;  }  // ファイルにデータを書き込み  for( i=0; i<num; i++)  {   fprintf( fp, "%s\n", Data[ i ] );  }  fclose( fp ); } ---------------------------------------------------------------- 理解できたでしょうか^_^; わからない箇所は、追って質問してくださいね。

ko-web
質問者

補足

返信遅くなり申し訳ございませんでした。 ご丁寧にソースまで記述していただきお手数お掛けしました。 このソースであれば4ヶ月の僕でも理解できました。 本当にありがとうございます。もう1つご質問があるのですが よろしいでしょうか? >/* >  このコメント欄内には >   Data変数に書き込み文字列を代入する処理 >  を記述する > */ このコメント内にも、もしよろしければBlueStonesさんの サンプルソースで構いませんので処理ソースお願い できますでしょうか?お手数お掛けしますがよろしくお願い いたします。

全文を見る
すると、全ての回答が全文表示されます。
  • nshooter
  • ベストアンサー率25% (2/8)
回答No.3

1.もし、C言語で書きたいのなら、わたしなら、長さは不明ですが、 高々全部で50行しかないので、メモリにいったん読み込んでしまいます。 2.メモリに読み込む方法は、配列でも(固定エリア分メモリを食う方式)、malloc(OSにメモリくれーって頼んで、頼んだ分もらう方式。使い終わったらfreeで開放するのを忘れずに)でも状況によりけりですが、多分用途はログの処理かなんかでしょ。こだわるといくらでも長くなるので、 mallocで固定エリア確保して、それより読み込みが多ければエラーで十分だと思う。(もっといい方法は幾らもあるがその分プログラムが複雑になる、たとえばエラーにせずにさらにメモリをぶん取って処理をつづける方法もあるが、トータルでどんだけメモリをぶん取ったのか覚えておいてどこかでエラーにしないと駄目だぞ。メモリがなくなって死ぬぞ) 3.メモリに読み込む時に行数を数えておく、50行以下と51行以上では、まったく違う処理に振り分けて考えよう。 4.最後にメモリの内容をファイルに吐き出せば、良い。 5.二行目を読み込む時にすかさず、読み込んだメモリの位置を変数に覚えておいて、書き出すときはこの位置から書き出す方式もある。 6.プログラムが書いてないのは意地悪じゃなくって、こういう単純なプログラムは、用途によって、「使える・使えない」が、ううーーーんと、 違うんだ。あなたが何を重視するかによって、おのずと書くプログラムが、ひとつに決まるはず。 7.マニュアルを読むのならfseekの項も読んだ方が良い。あと、C言語ならあなたの書いたプログラムには、fopenを忘れているぞ。 8.fopenの同項目のアペンドは仕様を誤解しやすい処なので、使う必要があるのならば特に注意して使う必要がある。初心者ならば、知っていても避けた方が、無難。 9.もしWindows上のC言語ならば(Windows上で動作するDOSは関係ない)これらでも、動作はするものの独特の制限があるので、マニュアルを引く事。特にメモリ取得関係は変えないと駄目。今書いた全ての関数は別関数に移行している。Linuxとかならこの行は全く関係ないです。

ko-web
質問者

お礼

お返事遅くなり申し訳ございません。大変貴重な回答を頂き ありがとうございます。ずばりlogの処理です。 えっ!こういう処理って難易度てきに簡単な処理だったんですか? 自分では全く処理が浮かばず前に進めない状態でした・・・。 知識が全くないので、これからしっかり勉強したいと思います。 本当にアドバイスありがとうございます。nshooterさんの 貴重なアドバイスをメモしておきます。

全文を見る
すると、全ての回答が全文表示されます。
  • nk2
  • ベストアンサー率23% (6/26)
回答No.2

C++の標準ライブラリ(STL) dequeを用いれば簡単に実装できると思う。 //---------------------------------------------------------- #include <deque> #include <string> //---------------------------------------------------------- class My_Buffer { deque<string> buf; public: void add(string& text) { if(buf.size() >= 50) buf.pop_front(); buf.push_back(text); } const deque<string>& GetBuffer() const { return buf; } }; //---------------------------------------------------------- int main() { My_Buffer buf; string text = "ABC"; for(int k=0;k < 2;k++) { for(int i=0;i < 25;i++) buf.add(text); text = "DEF"; } //const忘れないでね。 const deque<string> TEXT = buf.GetBuffer(); for(unsigned int i=0;i < TEXT.size();++i) { cout << TEXT[i] << endl; } } //---------------------------------------------------------- 何も考えずにMy_Buffer.add()に書き込む順番に文字列を渡していく。 そしてGetBufferで取得して取得した文字列配列からファイルに書き込む。

ko-web
質問者

お礼

返事が遅くなり申し訳ございませんでした。 >C++の標準ライブラリ(STL) >dequeを用いれば簡単に実装できると思う。 ご丁寧にソースまで記述していただきありがとうございます。 が、自分自身がC/C++の勉強不足で処理内容に理解しかねます。 本当にご丁寧に指導いただいているのに申し訳ございません。 印刷して理解できるまで目を通したいと思います。 貴重な回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
noname#86752
noname#86752
回答No.1

その操作は非常に厄介です。 やりたいことを簡潔に表すとファイルの最後の50行を書き込むだけなので、一度書いたファイルを操作するようなことをせずにファイルを読み込みながら最後の50行だけを保持し、ファイルを読み終わってから書き込んだほうがプログラムがすっきりすると思いますが、いかがでしょう?

ko-web
質問者

補足

お返事遅くなり申し訳ございませんでした。 貴重なアドバイスありがとうございます。 が・・・、読み込みながら最後の行だけを保持して、 ファイルを読み終わってから書き込む処理が どう処理すればよいか浮かんできません。 もしよろしければ、簡単なサンプルソースお願い できますでしょうか?わがままな質問で申し訳 ございませんがよろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語、ファイル操作、fgets()について

    次のプログラムは入力された行を読み込み、コマンドラインで指定されたファイルに書き込みます。 空白行が入力されたら、入力の終了とみなしてファイルを閉じます。続いてファイルを入力用に開き、 fgets()を使ってファイルの内容を表示するものです。 (ソースコードが長くてすみません) #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp; char str[80]; /* コマンドライン引数を検査する */ if(argc!=2) { printf("ファイル名を指定してください\n"); exit(1); } /* 出力用にファイルを開く */ if((fp = fopen(argv[1], "w"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } printf("終了するには空白行を入力してください\n"); do { printf(": "); gets(str); strcat(str, "\n"); /* 改行を追加する */ if(*str != '\n') fputs(str, fp); } while(*str != '\n'); fclose(fp); /* 入力用にファイルを開く */ if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } /* ファイルを読み込み直す */ do { fgets(str, 79, fp); if(!feof(fp)) printf(str); } while(!feof(fp)); fclose(fp); return 0; } 【質問】fgets()内のint型の数値「79」がどうして79なのかが分かりません。     80でも良いような気がするのですが・・・

  • C++におけるバイナリファイルの入出力について

    VisualStudioExpress2015のC++にて、次のような記述をし、二回目に実行したところアクセス違反が発生してしましました。 内容としてはセーブデータが見つからない場合はセーブデータにクラスの情報を書き込み、セーブデータがあった場合はセーブデータからクラスの情報を読み込むというものです。 #include <stdio.h> #include <stdlib.h> #include <string> #include <map> using namespace std; class MyClass { public: MyClass(); ~MyClass(); //private: int x, y; char *str; map<int,string> mMap; }; MyClass::MyClass() { } MyClass::~MyClass() { } void write() { MyClass *myclass = new MyClass; myclass->x = 10; myclass->y = 100; myclass->str = "aaaa"; myclass->mMap[10] = "bbbb"; FILE *fp1; if (fopen_s(&fp1,"セーブデータ.dat", "wb") != 0) {//エラーが起きたらNULLを返す return; } fwrite(&myclass, sizeof(myclass), 1, fp1); // SaveData_t構造体の中身を出力 fclose(fp1);//ファイルを閉じる } void read() { MyClass *myclass2 = new MyClass; FILE *fp2; if (fopen_s(&fp2,"セーブデータ.dat", "rb") != 0) { return; } fread(&myclass2, sizeof(myclass2), 1, fp2); fclose(fp2); printf("x=%d\ny=%d\nstr=%s\nmMap[10]=%s\n", myclass2->x, myclass2->y,myclass2->str,myclass2->mMap[10].c_str()); } int main() { FILE *fp; if (fopen_s(&fp, "セーブデータ.dat", "rb") != 0) { write(); } else { read(); } system("pause"); return 0; } どこをどう記述し直したら上手く動作するのでしょうか。 これを応用して、バイナリファイルの入出力を使ってゲームのセーブデータのようなものを実現しようと考えています。 そちらの方では多くの量のデータがあるので、できるだけクラスごとバイナリファイル等に保存するようにしたいのですが、もし上記の方法が無理な場合他にどのような方法があるか教えていただきたいです。

  • newかFILEでエラーのような

    エラーがおこらないと思うんだけど、実行時エラーです。 コンソールアプリケーションのソースを見てください。 fclose(fp); を2行上に移動した場合はエラーにはなりません。 これはどうしてエラーになるんですか? test.txtは、同じディレクトリにある0バイトのファイルです。 #include <windows.h> #include <iostream.h> int main(){  WIN32_FIND_DATA finddata;  FILE *fp;  char *str;  char **pp;  FindClose(FindFirstFile("test.txt", &finddata));  fp = fopen("test.txt", "r");  if(fp){   str = new char[14];   fclose(fp);   strcpy(str, "abcdefghijklm");   pp = new char*[3];   pp = &str;   delete [] *pp;   delete [] str;  }else cout << endl;  return 0; }

  • C言語 複数ファイル操作について

    Cプログラミング初心者です。 論文などの何行も文章があるようなテキストファイル(ここでは1.txtとします)と、他に予め単語をいくつか登録しているテキストファイル(2.txt)を開き、1.txtを最初の行から一行ごとに読み込み、2.txtの中にある単語が1つでもその一行の文章中に含まれていたらその一行の文章を出力し、また次の行においても2.txtの中にある単語のいずれかが含まれているかどうかを調べて含まれている場合は出力…含まれていない場合は出力せずに次の行へ…といったようにこれを1.txt内の最後の行まで繰り返し行うプログラムを作りたいのですが、自分が作ったプログラムでは含む・含まない関係なく1.txt内の文章全てが出力されてしまいます。おそらく最初のwhile文あたりがおかしいのだろうという予想はつくのですがどのように直せばよいのかわからず悩んでいます。どなたか教えていただければ嬉しいです(;_:) #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 1056 void delkaigyo(char *s1,char *s2){ char *p = s1; p=strstr(s1,s2); if(p!=NULL){ strcpy(p,p+strlen(s2)); delkaigyo(p+1,s2); } } int main(void){ FILE *fp; char *filename = "2.txt"; char str1[N]; char str2[N]; char kaigyo[] = "\n"; int i; int a=0; char fname[64]; printf("file:"); scanf("%s", fname);   ←ここで1.txtを入力するとします fp = fopen(fname, "r"); while(fgets(str1, N, fp) != NULL){ delkaigyo(str1, kaigyo); memset(str1, 0, N); fread(str1, 1, N-1, fp); if((fp = fopen(filename, "r")) == NULL){ fprintf(stderr, "%serror.\n", filename); exit(EXIT_FAILURE); } while(fgets(str2, N, fp) != NULL){ delkaigyo(str2,kaigyo); if(strstr(str1,str2)!=NULL){ a = 1; printf("%s\n", str1); break; } } if(a==0){ return 0; } fclose(fp); } return EXIT_SUCCESS; }

  • ファイルの入出力

    初心者です。よろしくお願いします。 私は今、ErgoVista(EarthView)というソフトで画像を表示するために、datファイルを入力して、x00ファイルを出力するプログラムを作っています。datファイルをエディタで表示すると2行45万列の複素データが出てきます。 とりあえず何の処理もせず、ErgoVistaファイル入出力の例から、下のようなプログラムを作ったのですが、実行ができなく 「unknown software exception(0xc00000fd)がアプリケーションの0x00401997で発生しました」と出てきました。 初心者でして、なんで実行ができないのかまったくわかりません。誰か教えてください。 下のソースファイルで間違っているとこがありましたら、教えてもらえると幸いです。 #include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> void Make_Header(char*,int,int); //ヘッダファイル書き出し関数,このまま使用 #define T 451584 main() { /*変数宣言*/ int i; long j; double data1[2][T]; FILE *fp_i, *fp_o; /*入力*/ printf("data in start\n"); fp_i = fopen("200113-HH-100a-IFFT.dat", "r"); for(j = 0; j < T; j++){ for(i = 0; i < 2; i++){ fread(&data1[i][j],sizeof(double),1,fp_i); } } //fread(代入する変数ポインタ,データ型サイズ,データ数,fp_i); fclose(fp_i); //開いたらちゃんと閉じる /*************************************** 処理部分 ***************************************/ /*出力*/ printf("write in start\n"); fp_o = fopen("200113-HH-100a-IFFT1.x00", "wb"); //ファイルオープン,wbはオープン形式でバイナリファイル書き出し fwrite(&data1[i][j],sizeof(double),1,fp_o); //出力部分,ループでまわしたり fclose(fp_o); //開いたらちゃんと閉じる Make_Header("200113-HH-100a-IFFT1.x00",2,T); //ErgoVistaのヘッダファイル情報を出力する関数,?pixel(横数)とline(縦数)を出入? return 0; } /* ヘッダ情報書きこみのサブルーチン このまま使用*/ void Make_Header(char FN[], int pixel, int line) { char hd[40]="", text[40]; FILE *fhd; strncat(hd, FN, strlen(FN)-3); strcat(hd, "hdr"); if((fhd = fopen(hd, "w")) == NULL){ printf("error : cannot open [%s] (header file)\n", FN); exit(1); } fprintf(fhd, "FILE_TYPE = IMAGE \n"); fprintf(fhd, "IMAGE_LINES = %d \n",line); fprintf(fhd, "LINE_SAMPLES = %d \nEND\n",pixel); fclose(fhd); }

  • ファイルの入出力について教えてください。

    初心者です。よろしくお願いします。 私は今、ErgoVista(EarthView)というソフトで画像を表示するために、datファイルを入力して、x00ファイルを出力するプログラムを作っています。datファイルをエディタで表示すると2行45万列の複素データが出てきます。 とりあえず何の処理もせず、ErgoVistaファイル入出力の例から、下のようなプログラムを作ったのですが、実行ができなく 「unknown software exception(0xc00000fd)がアプリケーションの0x00401997で発生しました」と出てきました。 初心者でして、なんで実行ができないのかまったくわかりません。誰か教えてください。 下のソースファイルで間違っているとこがありましたら、教えてもらえると幸いです。 #include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> void Make_Header(char*,int,int); //ヘッダファイル書き出し関数,このまま使用 #define T 451584 main() { /*変数宣言*/ int i; long j; double data1[2][T]; FILE *fp_i, *fp_o; /*入力*/ printf("data in start\n"); fp_i = fopen("200113-HH-100a-IFFT.dat", "r"); for(j = 0; j < T; j++){ for(i = 0; i < 2; i++){ fread(&data1[i][j],sizeof(double),1,fp_i); } } //fread(代入する変数ポインタ,データ型サイズ,データ数,fp_i); fclose(fp_i); //開いたらちゃんと閉じる /*************************************** 処理部分 ***************************************/ /*出力*/ printf("write in start\n"); fp_o = fopen("200113-HH-100a-IFFT1.x00", "wb"); //ファイルオープン,wbはオープン形式でバイナリファイル書き出し fwrite(&data1[i][j],sizeof(double),1,fp_o); //出力部分,ループでまわしたり fclose(fp_o); //開いたらちゃんと閉じる Make_Header("200113-HH-100a-IFFT1.x00",2,T); //ErgoVistaのヘッダファイル情報を出力する関数,?pixel(横数)とline(縦数)を出入? return 0; } /* ヘッダ情報書きこみのサブルーチン このまま使用*/ void Make_Header(char FN[], int pixel, int line) { char hd[40]="", text[40]; FILE *fhd; strncat(hd, FN, strlen(FN)-3); strcat(hd, "hdr"); if((fhd = fopen(hd, "w")) == NULL){ printf("error : cannot open [%s] (header file)\n", FN); exit(1); } fprintf(fhd, "FILE_TYPE = IMAGE \n"); fprintf(fhd, "IMAGE_LINES = %d \n",line); fprintf(fhd, "LINE_SAMPLES = %d \nEND\n",pixel); fclose(fhd); }

  • ファイルの入出力

    初心者です。よろしくお願いします。 私は今、ErgoVista(EarthView)というソフトで画像を表示するために、datファイルを入力して、x00ファイルを出力するプログラムを作っています。datファイルをエディタで表示すると2行45万列の複素データが出てきます。 とりあえず何の処理もせず、ErgoVistaファイル入出力の例から、下のようなプログラムを作ったのですが、実行ができなく 「unknown software exception(0xc00000fd)がアプリケーションの0x00401997で発生しました」と出てきました。 初心者でして、なんで実行ができないのかまったくわかりません。誰か教えてください。 下のソースファイルで間違っているとこがありましたら、教えてもらえると幸いです。(エラーは出ませんでした) #include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h> void Make_Header(char*,int,int); //ヘッダファイル書き出し関数,このまま使用 #define T 451584 main() { /*変数宣言*/ int i; long j; double data1[2][T]; FILE *fp_i, *fp_o; /*入力*/ printf("data in start\n"); fp_i = fopen("200113-HH-100a-IFFT.dat", "r"); for(j = 0; j < T; j++){ for(i = 0; i < 2; i++){ fread(&data1[i][j],sizeof(double),1,fp_i); } } //fread(代入する変数ポインタ,データ型サイズ,データ数,fp_i); fclose(fp_i); //開いたらちゃんと閉じる /*************************************** 処理部分 ***************************************/ /*出力*/ printf("write in start\n"); fp_o = fopen("200113-HH-100a-IFFT1.x00", "wb"); //ファイルオープン,wbはオープン形式でバイナリファイル書き出し fwrite(&data1[i][j],sizeof(double),1,fp_o); //出力部分,ループでまわしたり fclose(fp_o); //開いたらちゃんと閉じる Make_Header("200113-HH-100a-IFFT1.x00",2,T); //ErgoVistaのヘッダファイル情報を出力する関数,?pixel(横数)と?line(縦数)を出入? return 0; } /* ヘッダ情報書きこみのサブルーチン このまま使用*/ void Make_Header(char FN[], int pixel, int line) { char hd[40]="", text[40]; FILE *fhd; strncat(hd, FN, strlen(FN)-3); strcat(hd, "hdr"); if((fhd = fopen(hd, "w")) == NULL){ printf("error : cannot open [%s] (header file)\n", FN); exit(1); } fprintf(fhd, "FILE_TYPE = IMAGE \n"); fprintf(fhd, "IMAGE_LINES = %d \n",line); fprintf(fhd, "LINE_SAMPLES = %d \nEND\n",pixel); fclose(fhd); }

  • C言語 iMacでのファイル入出力

    #include <stdio.h> int main() { FILE *fp; fp=fopen("test.txt","w"); if (fp==NULL){ perror("ファイル・オープンに失敗しました\n"); return -1; }else printf("ファイルを正常に開きました\n"); fprintf(fp,"これが初めてのファイル入出力です\n"); if (fclose(fp)!=0){ perror("ファイル・クローズに失敗しました\n"); return -1; }else printf("ファイルを正常に閉じました\n"); return 0; } これを実行してもどこにもtest.txtというファイルがありません。 同じプログラムをwinでも実行してみたところ正常にファイルが作られました。 mac初心者なもんで、どうすればいいのでしょうか?

  • C++でのファイル入出力について

    C++で計算したデータを何かファイルに保存しようとしています。 #include<iostream> #include<fstream> using namespace std; int main() { ofstream fout("test0.txt");     //ここで処理をしてファイルに書き込む作業を行う fout.close(); return 0; } 以上のようなサンプルがあったすると、ファイルはカレントディレクトリ に保存されますよね。 そのファイルの保存先を指定するようにするにはどうしたらいいですか? よろしくお願いします。

  • ファイルから文字列を読み出して16進数に変換

    test1.txtというファイルから文字列を読み出して16進数に変換、という処理をしたいのですがうまくいきません。どこがどう悪いのでしょうか?ご教授のほどお願いします。 ---------------------- #include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { FILE *fp; char *fname = "test1.txt"; char str[100]; int num; fp = fopen( fname, "r" ); if( fp == NULL ){ printf( "%s is not open.\n", fname ); return -1; } while( fgets(str, 100, fp ) != NULL ){ num = strtol(str, NULL, 16); printf( "%s", str ); printf("%x\n", num); //ここでうまく出力されません } fclose( fp ); return 0; } ---------------- ちなみに、test1.txtの中身は以下のようになってます。 44DB4147E6075A92E878EB68C44DD51F 5DCE86622D846BF272215A792AF31A3E 46FF69A29D3DF1D4842461B239256C26