【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.20795

ファイル間の文字列の比較
投稿者---ken(2005/04/26 00:10:52)


二つのファイル

test.txt   test2.txt

0001    0002
0002     0004
0040     0023
0008     0012
0004    0005
・       ・
・       ・
・       ・

test.txtから文字列「0001」を取り出してtest2.txtの一番上から順番に検索して見つかればtest3.txtに出力
test.txtから文字列「0002」を取り出してtest2.txtの一番上から順番に検索して見つかればtest3.txtに出力
というように繰り返すプログラムをつくりたいんです。
見よう見まねで、以下のようなプログラムを組んだんですが、「0001」と出力されるだけです。どうしたらいいでしょう>?

<pre>
#include <stdio.h>
#include <string.h>

main()
{
char Av[10],Av2[10];

FILE * fp;
FILE * fp2;
FILE * fp3;

fp = fopen("test.txt","r");
fp2 = fopen("test2.txt","r");
fp3 = fopen("test3.txt","w");

while(fgets(Av,9,fp1)
while(fgets(Av2,9,fp2)

if(strncmp(Av,Av2,9) == 0)
fprintf(fp3, "%s,\n", Av2);
}

</pre>


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ファイル間の文字列の比較 20796 RiSK 2005/04/26 00:29:25


No.20796

Re:ファイル間の文字列の比較
投稿者---RiSK(2005/04/26 00:29:25)


>test.txtから文字列「0001」を取り出してtest2.txtの一番上から順番に検索して見つかればtest3.txtに出力

この時点でtest2.txtのストリームのファイル位置表示子は進んでいます。
ですから

>test.txtから文字列「0002」を取り出してtest2.txtの一番上から順番に検索して見つかればtest3.txtに出力

のためにはtest2.txtのストリームのファイル位置表示子を巻き戻す必要があります。

#include <stdio.h>
#include <string.h>

#define BUF_SIZE 8

int main(void)
{
    FILE * f1, * f2, * f3;
    char buf1[BUF_SIZE], buf2[BUF_SIZE];

    if ((f1 = fopen("test.txt", "r")) == NULL) { return 1; }
    if ((f2 = fopen("test2.txt", "r")) == NULL) { fclose(f1); return 1; }
    if ((f3 = fopen("test3.txt", "w")) == NULL) { fclose(f1); fclose(f2); return 1; }

    while (fgets(buf1, BUF_SIZE, f1)) {
        while (fgets(buf2, BUF_SIZE, f2)) {
            if (strcmp(buf1, buf2) == 0) {
                fprintf(f3, "%s,\n", buf1);
                break;
            }
        }
        rewind(f2);  // 巻き戻し
    }

    fclose(f1);
    fclose(f2);
    fclose(f3);

    return 0;
}



この投稿にコメントする

削除パスワード

No.20797

Re:ファイル間の文字列の比較
投稿者---ken(2005/04/26 00:51:56)



>のためにはtest2.txtのストリームのファイル位置表示子を巻き戻す必要があります。

なるほど!検索するためにストリームのファイル位置表示子が進んでいるから、巻き戻してからでないと頭から検索できないんですね!
ありがとうございました!!



この投稿にコメントする

削除パスワード

No.20798

Re:ファイル間の文字列の比較
投稿者---ken(2005/04/26 01:22:23)


ソースを呼んでいて分からないところが
if ((f1 = fopen("test.txt", "r")) == NULL) { return 1; }
    if ((f2 = fopen("test2.txt", "r")) == NULL) { fclose(f1); return 1; }
    if ((f3 = fopen("test3.txt", "w")) == NULL) { fclose(f1); fclose(f2); return 1; }


の部分の{}の中の処理はどういう処理をしているのでしょうか?
{return1;}



この投稿にコメントする

削除パスワード

No.20800

Re:ファイル間の文字列の比較
投稿者---Blue(2005/04/26 02:00:29)


>の部分の{}の中の処理はどういう処理をしているのでしょうか?
>{return1;}
エラーが発生したのでそこで処理を終了しています。
(この場合はファイルが開けないというエラー)

通常main関数の中の戻り値は、プログラムが正常終了した時に 0 を返し、
それ以外のエラーの時は -1 か 1 にするのが一般的のようです。



この投稿にコメントする

削除パスワード

No.20801

Re:ファイル間の文字列の比較
投稿者---Ban(2005/04/26 05:20:45)


# stdlib.h に EXIT_SUCCESS / EXIT_FAILURE という
# 定数マクロがあったりもします。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧