web-dev-qa-db-ja.com

テキストファイルからCの配列に数値を読み込む

私はプログラミング初心者なので、我慢してください。

テキストファイルから配列に数値を読み取ろうとしています。テキストファイル「somenumbers.txt」は、単に「5623125698541159」のように16個の数字を保持しています。

#include <stdio.h>
main()
{

    FILE *myFile;
    myFile = fopen("somenumbers.txt", "r");

    //read file into array
    int numberArray[16];
    int i;

    for (i = 0; i < 16; i++)
    {
        fscanf(myFile, "%d", &numberArray[i]);
    }

    for (i = 0; i < 16; i++)
    {
        printf("Number is: %d\n\n", numberArray[i]);
    }


}

プログラムが機能しません。コンパイルしますが、出力します:

番号:-104204697

数は:0

番号:4200704

番号:2686672

番号:2686728

番号は:2686916

番号:2004716757

番号:1321049414

数:-2

番号は:2004619618

番号:2004966340

番号:4200704

番号:2686868

番号は:4200798

番号:4200704

番号は:8727656

プロセスが20(0x14)の実行時間を返しました:0.118 s続行するには、任意のキーを押します。

26
Vonti

への変更

fscanf(myFile, "%1d", &numberArray[i]);
28
BLUEPIXY

5623125698541159は単一の数値として扱われます(ほとんどのアーキテクチャではintの範囲外)。ファイルに数字を書く必要があります

5 6 2 3 1 2 5  6 9 8 5 4 1 1 5 9  

16個の数字用。

ファイルに入力がある場合

5,6,2,3,1,2,5,6,9,8,5,4,1,1,5,9 

次に、fscanf%d指定子を%d,に変更します。

  fscanf(myFile, "%d,", &numberArray[i] );  

いくつかの変更後の完全なコードは次のとおりです。

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

int main(){

    FILE *myFile;
    myFile = fopen("somenumbers.txt", "r");

    //read file into array
    int numberArray[16];
    int i;

    if (myFile == NULL){
        printf("Error Reading File\n");
        exit (0);
    }

    for (i = 0; i < 16; i++){
        fscanf(myFile, "%d,", &numberArray[i] );
    }

    for (i = 0; i < 16; i++){
        printf("Number is: %d\n\n", numberArray[i]);
    }

    fclose(myFile);

    return 0;
}
12
haccks
for (i = 0; i < 16; i++)
{
    fscanf(myFile, "%d", &numberArray[i]);
}

これは、文字列全体"5623125698541159"&numArray[0]に読み取ろうとしています。数字の間にはスペースが必要です。

5 6 2 3 ...
3
Fiddling Bits

%cでループして、%dではなく1文字ずつストリームを読み取ります。

2
Pierre Arlaud

コードには2つの問題があります。

  • scanfの戻り値必須チェックする
  • %d変換ではオーバーフローは考慮されません(連続する数字ごとに*10 + newdigitを盲目的に適用します)

最初に取得した値(-104204697)は、5623125698541159 modulo 2^32;と等しくなります。したがって、オーバーフローの結果です(64ビット幅のintの場合、オーバーフローは発生しません)。次の値は初期化されていない(スタックからのガベージ)ため、予測できません。

必要なコードは(上記のBLUEPIXYの答えに似ています。scanfの戻り値、正常に一致したアイテムの数を確認する方法を示しています):

#include <stdio.h>

int main(int argc, char *argv[]) {
    int i, j;
    short unsigned digitArray[16];
    i = 0;
    while (
        i != sizeof(digitArray) / sizeof(digitArray[0])
     && 1 == scanf("%1hu", digitArray + i)
    ) {
        i++;
    }
    for (j = 0; j != i; j++) {
        printf("%hu\n", digitArray[j]);
    }
    return 0;
}
2
Loic