私はプログラミング初心者なので、我慢してください。
テキストファイルから配列に数値を読み取ろうとしています。テキストファイル「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続行するには、任意のキーを押します。
への変更
fscanf(myFile, "%1d", &numberArray[i]);
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;
}
for (i = 0; i < 16; i++)
{
fscanf(myFile, "%d", &numberArray[i]);
}
これは、文字列全体"5623125698541159"
を&numArray[0]
に読み取ろうとしています。数字の間にはスペースが必要です。
5 6 2 3 ...
%cでループして、%dではなく1文字ずつストリームを読み取ります。
コードには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;
}