• ベストアンサー

ファイルへの落とし方について

先日、「教えてgoo」において「ファイルへの格納について」という題名で質問をして御助言いただいた者です。 御助言に基き以下のようなプログラムを作ってみました。 #include <stdio.h> void main(void) FILE *fpr,*fph; char r[256],h[5], fpr = fopen("origin.txt","rt");   fph = fopen("head.txt","wt");      while ( fgets(r,256,fpr) != NULL ){     h[0] = r[0] ;     h[1] = r[1] ;     h[2] = r[2] ;     h[3] = r[3] ;     h[4]=r[4]; h[5]=r[5]; h[6]=r[6]; h[7]=r[7]; h[8]=r[8]; h[9]=r[9]; h[10]=r[10];     h[24]=r[11]; h[25]=r[12]; h[26]=r[13]; h[27]=r[14]; fputs(h,fph); } fclose (fpr);       fclose(fph);   } というプログラムを書いてみました。当初の予定とは若干異なり、スペースを含む28桁のデータ(4桁毎に2つのスペースがあり、4桁が5つで1行)の最初の12桁と最後の4桁だけを取り出しそれらをくっつけて1つのファイルに落としたいと思っています。たとえば 6528 1285 1259 1238 1257 というデータならば 6528 1285 1257 というような形になるようにしたいのです。 このようなデータが何行も続いてます。 しかし、上のプログラムを実行すると 6528 1285 1257 1259 1238 のようになってしまいます。 h[i]で定義しなかったはずの部分のデータまでファイルに落ちてしまうのです。よろしければ、改善策を教えてください。お願いします。

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

  • ベストアンサー
  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.3

こんにちは、No.1のarukamunです。 >あとh[14]='\0';が改行の¥nではなく¥0になっているのは何か意味があるのでしょうか? '\0' は文字列がここまでですという為のコードです。 '\n' は改行コードですね。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=573817 ここで、'\n'にしてしまっていましたけど、'\0'が無い事による不具合がでる可能性がありました。今頃気がついたんですが。 No.2さんがかかれた様にする事で、バグがとれますね。(笑) fgets関数が、最後に改行コードを吐いてくれるのか吐いてくれないのかがシステムによって違うかもしれないので、頭がこんがらがっていました。 h[16] = '\n' ; h[17] = '\0' ; で、余計に改行されてしまうようであれば、 h[16] = '\0' ; にする事で解消すると思います。

takamako1
質問者

お礼

ありがとうございました。おかげ様で問題は無事に解決いたしました。また、機会がありましたら宜しくお願いします。

その他の回答 (2)

  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.2

#include <stdio.h> void main(void) { FILE *fpr,*fph; char r[256],h[18], fpr = fopen("origin.txt","rt");   fph = fopen("head.txt","wt");      while ( fgets(r,256,fpr) != NULL ){     h[0] = r[0] ;     h[1] = r[1] ;     h[2] = r[2] ;     h[3] = r[3] ;     h[4]=r[4]; h[5]=r[5]; h[6]=r[6]; h[7]=r[7]; h[8]=r[8]; h[9]=r[9]; h[10] = r[10] ; h[11] = r[11] ; h[12] = r[24] ; h[13] = r[25] ; h[14] = r[26] ; h[15] = r[27] ; h[16] = '\n' ; h[17] = '\0' ; fputs(h,fph); } fclose (fpr);       fclose(fph);   } 最後に\0が無いと、\0が見つかるまで延々メモリの中身が書き出されますよ。 http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fputs.3.html

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fputs.3.html
takamako1
質問者

お礼

ありがとうございました。おかげ様で問題は無事に解決いたしました。また、機会がありましたら宜しくお願いします。

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.1

#include <stdio.h> void main(void) FILE *fpr,*fph; char r[256],h[15] ;   fpr = fopen("origin.txt","rt");   fph = fopen("sample.txt","wt");   while ( fgets(r,256,fpr) != NULL ){     h[0] = r[0] ;     h[1] = r[1] ;     h[2] = r[2] ;     h[3] = r[3] ;     h[4] = r[4] ;     h[5] = r[5] ;     h[6] = r[6] ;     h[7] = r[7] ;     h[8] = r[8] ;     h[9] = r[9] ;     h[10] = r[20] ;     h[11] = r[21] ;     h[12] = r[22] ;     h[13] = r[23] ;     h[14] = '\0' ;     fputs(h,fph);   }   fclose (fpr);       fclose(fph); } プログラム的にはもっと簡略化出来るのですが、わかりやすく書きました。 h[xx] = r[yy] ; というところが何を意味しているかをよく考えてみてください。

takamako1
質問者

お礼

すみません。間違えました。質問のプログラムのh[xx]r[yy] のxxとyyの部分を逆にかいてしまいました。つまり、御解答のプログラムとほぼ同じようにしているはずなのに不具合が起きてしまいます。どうしてなんでしょうか?

takamako1
質問者

補足

あとh[14]='\0';が改行の¥nではなく¥0になっているのは何か意味があるのでしょうか?

関連するQ&A