0

宿題- ファイルを読み取るプログラムを作成する課題があります。ファイルは次のようになります。

B 34 55 66 456 789 78 59 2 220 366 984 132 2000 65 744 566 377 905 5000
I 9000
I 389
Dm
DM

数値の配列からバイナリ ヒープを構築する場所B(B に続く数値。I は配列/ヒープに数値を挿入する Dm は削除の最小値であり、DM は削除の最大値です。

ヒープのコードを書いたので、配列にrandom numbers. 私の問題はそれを読んで、それを aと anfirst lineに解析することです。string Barray

次のコードを使用してみましたが、明らかに機能しません。

char line[8];
char com[1];
int array[MAX] //MAX is pre-defined as 100

FILE* fp = fopen( "input_1.txt", "r" );
if( fp )
{
    while( fgets ( line, sizeof(line), fp ) != NULL  )
    {
        sscanf(line, "%s" "%d", &com, &array );
        ... //Following this, I will have a nested if that will take
        each string and run the appropriate function.

        if ( strcmp( com, "B" ) == 0 )
        {
            fill_array( array, MAX );
            print_array( array, MAX );
        }        

合計 3 日間で約 6 時間本を読みましたが、問題の解決策が見つかりません。どんな助けでも素晴らしいでしょう。

4

2 に答える 2

2

以下は、ファイルを開き、1 行を読み取り、見つかったものをスペースで分割する小さなプログラムです。

void main()
{
    char str[50];
    char *ptr;
    FILE * fp = fopen("hi.txt", "r");
    fgets(str, 49, fp);             // read 49 characters
    printf("%s", str);              // print what we read for fun
    ptr = strtok(str, " ");         // split our findings around the " "

    while(ptr != NULL)  // while there's more to the string
    {
        printf("%s\n", ptr);     // print what we got
        ptr = strtok(NULL, " "); // and keep splitting
    }
    fclose(fp);
 }

したがって、次を含むファイルでこれを実行する必要がありました。

B 34 55 66 456 789 78 59 2 220

私は見ることを期待できます:

B 34 55 66 456 789 78
B 
34
55 
66
456
789
78

これを修正して自分自身を助ける方法がわかると思います。

于 2012-11-30T20:52:48.980 に答える
2

まず第一に、line配列のサイズはおそらく 8 よりも大きく、おそらくchar line[256]. 同じことがcom配列にも当てはまり、少なくとも 3 文字が必要です。

char line[256];
char com[3];

コマンドをコマンド引数から分離するために、 をfgets(line, sizeof(line), fp)使用してファイルを 1 行ずつ読み取る必要があります。strtok()

char separators[] = " ";
fgets(line, sizeof(line), fp);

char * p = strtok(line, separators);    // p will be a pointer to the command string
strncpy(&com, p, sizeof(com));    // copy the command string in com


// If the command is B, read an array
if (strcmp(com, "B") == 0) {
    p = strtok(NULL, separators);

    while (p != NULL) {
        int value_to_add_to_your_array = atoi(p);
        // ... add code to add the value to your array
        p = strtok(NULL, separators);
    }

    // ... call the function that creates your heap
}

// ... add code to handle the other commands

アイデアは、ファイルを 1 行ずつ読み取り、次に各行で最初にコマンドを読み取り、その値に基づいて残りの行を読み取る方法を決定することです。

B上記のコードでは、配列を読み取るコードを追加したコマンドを検討しました。

于 2012-11-30T20:53:08.347 に答える