2

/編集済み/ 私はここにいるのは初めてです。次のようなテキスト ファイルがあります。

6
<cr>
R 0
R 1
R 4
R 36
R 0
R 4

これは私が持っているものです。各行を配列に読み込んで、その配列を整数に変換できるようにして、後で必要な行の番号のみを出力できるようにします。

    #include <stdio.h>
    #include <conio.h>
    #include <math.h>
    #include <stdlib.h>
    #include <ctype.h>
    #include <string.h>


    int main()
    {
        FILE *fr;   /*declares file pointer*/
        int i, j, num[32];
        char array[32][32], input_file[32], line[32];
        printf("Enter file: ");
        fflush(stdin);
        scanf("%s", input_file);    
        fr = fopen(input_file, "r");
        for(i=0;i<32;i++)
            for(j=0;j<32;j++){
                array[i][j] = \'0';
            }
            for(i=0;i<32;i++){
                line[i] = '\0';
            }
        if(fr != NULL){

            while(fgets(line, sizeof(line), fr) != NULL){
                strcpy(array[i],line);
                    num[i] = atoi(array[i]);
                        i++;
                        printf("%d\n", num[i]);
            }
        }fclose(fr);
        else{
            perror(input_file);
        }
    }

エラーは発生していませんが、正しいものが印刷されていません。これはそれが印刷するものです:

-370086
-370086
-370086
-370086
-370086
-370086
-370086
-370086

誰が私に何がうまくいかないのか説明できますか?

4

3 に答える 3

2

私はこれを少し違った方法で扱うと思います。明示的に述べていませんが、最初の数字は、あと何行の文字/数字を読み取るかを示していると仮定します (空白行は含まれません)。したがって、それを読んでから、残りの行を読み、先頭の数字以外を無視して、数字だけに注意を払いたいと思います。

それが正しければ、コードをいくらか単純化できます。

int num_lines;
int i;
int *numbers;

fscanf(infile, "%d", &num_lines); // read the number of lines.

numbers = malloc(sizeof(int) * num_lines); // allocate storage for that many numbers.

// read that many numbers.
for (i=0; i<num_lines; i++)
    fscanf(infile, "%*[^0123456789]%d", numbers+i);
    // the "%*[^0123456789]" ignores leading non-digits. The %d converts a number.
于 2012-04-05T08:25:04.427 に答える
1

いくつかの問題があります。

  1. 何にも設定input_fileしていないので、ランダムなファイルを開いているようです。
  2. iネストされたループで二重に使用しています。
  3. まったく表示arrayされていないため、どのように宣言されているかわかりません。
  4. ループ インデックスを使用して数値を出力する前に、ループ インデックスを増やしているため、次の (まだ書き込まれていない) スロットで数値を常に "欠落" して出力します。

memset()心配な場合は、配列をクリアするために使用する必要があります。lineによって書き込まれるなど、上書きされる予定の配列をクリアする必要はありませんfgets()

于 2012-04-05T08:20:43.400 に答える
0

arrayが配列であると仮定すると、次のcharようになります。

...
strcpy(array[i],line);
num[i] = atoi(array[i]);
...

実際には、行全体ではなく行全体を変換しintegerます。の使用を検討するfscanfか、少なくとも line 変数内の整数を検索して変換する必要があります。

やり方atoi(array[i])は例と同じatoi("R 32\n")です。

于 2012-04-05T08:22:22.430 に答える