0

夜の最後の質問。闘争ごとに複数回投稿しないようにしています(笑)...

これはもう少し単純です。

最初の 8 行に一連の数字を並べた txt ファイルがあります。その後のすべての行は、「BUY ITEM」または「AWARD ITEM」のような特定のフレーズとそれに続く整数です (いくつかのフレーズがありますが、私が関心を持っているのは 1 つだけです)。基本的に、ドキュメント内のフレーズを検出できる for または while ループを作成し、ポインターをフレーズの末尾に設定してから、整数をフレーズの右側に fscanf しようとしています。私が抱えている唯一の問題は、特定のフレーズの終わりへのポインターを取得してから、番号を読み取ることです。フレーズが異なる行で繰り返されているという事実と同様に、値を一度に取得したくありません。

簡単なことなら確実にできると思います

while (!feof(//function for reading phrase)) {
      fscanf("%d", &value);
      //rest of function

そして、それはそれです。しかし、私は fseek と fget を試しましたが、移動先の事前設定された場所がなくても、必要な場所へのポインターを取得するのに役立つものは何もありませんでした。入力ファイルは毎回異なるため、1024 スペース下に移動するように指示することはできません。あなたがこれについてどうやって行くのかわからない...

また、以下は入力ファイルの例です。

75 75 908
10 10
18 23.10 10.09
70 5 15
8 100 20 28.99
30 40 50 60
4 6 8 8 5 5 5 6 7 10
10
BUY ITEM 8
BUY ITEM 10
AWARD ITEM 7
BUY ITEM 1
BUY ITEM 3
AWARD ITEM 9
BUY ITEM 7
RETURN ITEM 8

誰の助けにも感謝します。

4

1 に答える 1

0

問題の行で、ファイルが同じ形式に従っている場合、数字は常に行の同じ文字に表示されるという事実を使用して、これを行う簡単な方法を次に示します。これは少し壊れやすいので、たとえば任意の量の空白に対処するために、プログラムをより堅牢にする方がよいでしょうが、それは演習として残しておきます。

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

#define MAX_LEN 100
#define BUY_LEN 9
#define AWARD_LEN 11

int main(void) {
    FILE * infile = fopen("file.dat", "r");
    if ( !infile ) {
        perror("couldn't open file");
        return EXIT_FAILURE;
    }

    char buffer[MAX_LEN];
    char * endptr;

    while ( fgets(buffer, MAX_LEN, infile) ) {
        if ( !strncmp(buffer, "BUY ITEM ", BUY_LEN ) ) {
            char * num_start = buffer + BUY_LEN;
            long item = strtol(num_start, &endptr, 0);

            if ( endptr == num_start ) {
                fprintf(stderr, "Badly formed input line: %s\n", buffer);
                return EXIT_FAILURE;
            }

            printf("Bought item %ld\n", item);
        }
        else if ( !strncmp(buffer, "AWARD ITEM ", AWARD_LEN) ) {
            char * num_start = buffer + AWARD_LEN;
            long item = strtol(num_start, &endptr, 0);

            if ( endptr == num_start ) {
                fprintf(stderr, "Badly formed input line: %s\n", buffer);
                return EXIT_FAILURE;
            }

            printf("Awarded item %ld\n", item);
        }
    }

    fclose(infile);
    return 0;
}

質問のサンプル データ ファイルでこれを実行すると、次のようになります。

paul@local:~/src/sandbox$ ./extr
Bought item 8
Bought item 10
Awarded item 7
Bought item 1
Bought item 3
Awarded item 9
Bought item 7
paul@local:~/src/sandbox$ 

ちなみに、あなたの質問の提案の 1 つに基づいて、質問" while( !feof( file ) )" は常に間違っています .

于 2014-09-27T01:12:04.397 に答える