ファイルの読み書き

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
トマト

ファイルの読み書き

#1

投稿記事 by トマト » 15年前

テキストファイルの読み書きを行っています。
複数のファイルをいくつも読み込んで、一つのファイルに出力するようにしました。

以前に質問させて頂き 文字列1から 文字列2を検索するとの 書き方を教えていただきました。
今回は、そのプログラムに渡すファイルの部分を変更しなければならなくなり
永久ループ的になってしまったので
どう直したら良いか相談させて頂こうと思い書き込みさせて頂きました。
初歩的な問題で申し訳ありませんがもう分からなくなってしまって、よろしくお願いします。

if(argc < 2)
{
printf("Usage : XTYPE filename1 [filename2 ...]\n");
return -1;
}
if((fnotice = fopen( "notice.txt", "w" )) == NULL)
{
printf("can not open write file.");
return -2;
}
if((fcombi = fopen( "combi.txt", "w" )) == NULL)
{
printf("can not open write file.");
return -3;
}
while(--argc)
{
++argv;
if((fp = fopen( *argv, "r" )) == NULL)
{
printf("can not open file. %s\n", *argv);
return -2;
}
while(fgets(arpinfo,sizeof(arpinfo),fp))
{
printf("%s",arpinfo);
fprintf(fcombi, "%s", arpinfo);
}
}
if(!(fcombi = fopen("combi.txt", "r"))){
printf("can not open file.\n");
}
while(--argc){
++argv;
while(fgets(tmp, 1024, fcombi)){
if(!strstr(tmp, "iso")) continue;
if(AddString(tmp)) continue;
}
}

シエル

Re:ファイルの読み書き

#2

投稿記事 by シエル » 15年前

>今回は、そのプログラムに渡すファイルの部分を変更しなければならなくなり
>永久ループ的になってしまったので
読み込むファイル名が変わったということですか?
また、どの部分が永久ループになってしまったのかを、明確にしてください。

トマト

Re:ファイルの読み書き

#3

投稿記事 by トマト » 15年前

読み込みたいファイル名は可変です。
[___] ./fileOpen sample1 sample2 sample3 sample4
と引数に読み込みたいファイルを書き連ねていき、

while(--argc)
{
++argv;
if((fp = fopen( *argv, "r" )) == NULL)
{
printf("can not open file. %s\n", *argv);
return -2;
}
while(fgets(arpinfo,sizeof(arpinfo),fp))
{
printf("%s",arpinfo);
fprintf(fcombi, "%s", arpinfo);
}
}
fgetsで combi.txt(固定ファイル名)に読み込みたいファイルの中身が全て書き込まれたのを確認しました。

そのあとに、combi.txt内に必ず「iso」と書いてある文字列があるのですが
strstrで探している所で(<-プログラム内部処理の)
iso.3.6.1.2.1.4.22.1.2.9.192.168.64.90 = Hex-STRING: 00 AB B0 94 39 31
iso.3.6.1.2.1.4.22.1.2.9.192.168.64.99 = Hex-STRING: 00 A0 48 4E 67 80[EOF]
:
:
プロンプトが返ってこないんです。(プログラムが終了しない)

分かりにくい点あれば書き直します。よろしくお願いします

toyo

Re:ファイルの読み書き

#4

投稿記事 by toyo » 15年前

if(!(fcombi = fopen("combi.txt", "r"))){
でfcloseしないでfopenしているのが原因では
一旦fcloseするかfreopenを使ったらどうでしょう

シエル

Re:ファイルの読み書き

#5

投稿記事 by シエル » 15年前

combi.txtを一回fcloseしてから、fopenしてみるとどうなりますか?

追記:
すいません。かぶりました。。。 画像

トマト

Re:ファイルの読み書き

#6

投稿記事 by トマト » 15年前

while(--argc)
{
++argv;
if((fp = fopen( *argv, "r" )) == NULL)
{
printf("can not open file. %s\n", *argv);
return -2;
}
while(fgets(arpinfo,sizeof(arpinfo),fp))
{
printf("%s",arpinfo);
fprintf(fcombi, "%s", arpinfo);
}
}
fclose(fcombi);  (<-ココに入れました!)

if(!(fcombi = fopen("combi.txt", "r"))){
printf("can not open file.\n");
}

ですが、結果は同じでした。ファイルは無事に作成されていましたが
プロンプトが返って来ない状態です。

シエル

Re:ファイルの読み書き

#7

投稿記事 by シエル » 15年前

実際にブレークポイントを↓の中のどこかに設定してデバッグし、
argcの値や、どのようにループしているのかを教えてください。

while(--argc){
++argv;
while(fgets(tmp, 1024, fcombi)){
if(!strstr(tmp, "iso")) continue;
if(AddString(tmp)) continue;
}
}

トマト

Re:ファイルの読み書き

#8

投稿記事 by トマト » 15年前

ブレークポイントが置けないのでprintfしました。

while(--argc){
++argv;
printf("argc [%d]",argc); (<-ココに設置)

while(fgets(tmp, STRING_MAX, fcombi)){
if(!strstr(tmp, "iso")) continue;
if(AddString(tmp)) continue;
}
}
23178]argc [-1123179]argc [-1123180]argc [-1123181]argc [-1123182]argc [-1123183]argc [-1123184]argc [-1123185]argc [-1123186]argc [-1123187]argc [-1123188]argc [-1123189]argc [-1123190]argc [-1123191]argc [-1123192]argc [-1123193]argc [-1123194]argc [-1123195]argc [-11

ずっと繰り替えしてました。

while(fgets(tmp, STRING_MAX, fcombi)){
   if(!strstr(tmp, "iso"))
   {
     continue;
   }
   else
   {
     printf("%s",tmp);
   }

の場合には、「iso」のある文字列のみ出力されてプロンプトが返ってこない。

if(AddString(tmp))
{
continue;
}
else
{
printf("%s",tmp);
}
の場合も「iso」のある文字列のみ出力されてプロンプトが返ってこない。
状態でした。

シエル

Re:ファイルの読み書き

#9

投稿記事 by シエル » 15年前

argcの値を見れば、無限ループするのは明らかなのではないかと。

toyo

Re:ファイルの読み書き

#10

投稿記事 by toyo » 15年前

なんでargcがマイナスにと思ってよく見たら
while(--argc){
を2回実行してるんですね
1回目のwhileでargcは0になってますからだめですよ
カウンタを複数回使うならforループで回したほうがいいかも
for ( i = 1; i < argc; i++)

トマト

Re:ファイルの読み書き

#11

投稿記事 by トマト » 15年前

ありがとうございました。きちんとプログラムがとまりました。

while(fgets(tmp, STRING_MAX, fcombi)){
   if(!strstr(tmp, "iso"))
   {
     printf("can not iso\n");
     continue;
   }
   else
   {
     printf("%s",tmp);
   }

の場合に何も表示されない

if(AddString(tmp))
{
continue;
}
else
{
printf("%s",tmp);
}

の場合に何も表示されないのは何かあるのでしょうか?

トマト

Re:ファイルの読み書き

#12

投稿記事 by トマト » 15年前

すみません。
>while(--argc){
>を2回実行してるんですね
>1回目のwhileでargcは0になってますからだめですよ

argcは0になっていました。

ありがとうございました! 画像

トマト

Re:ファイルの読み書き

#13

投稿記事 by トマト » 15年前

解決いたしました。本当にありがとうございました

閉鎖

“C言語何でも質問掲示板” へ戻る