Ответ 1
измените на
fscanf(myFile, "%1d", &numberArray[i]);
Я программирую noob, поэтому, пожалуйста, несите меня.
Я пытаюсь читать числа из текстового файла в массив. Текстовый файл "somenumbers.txt" просто содержит 16 номеров как "5623125698541159".
#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 с Нажмите любую клавишу, чтобы продолжить.
измените на
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
затем измените спецификатор %d
в fscanf
на %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.
В коде есть две проблемы:
scanf
необходимо.%d
не учитывает переполнения (слепо применяя *10 + newdigit
для каждого последовательного числового символа)Первое значение, которое вы получили (-104204697
), равно 5623125698541159
по модулю 2^32
; это, таким образом, результат переполнения (если int
, где 64 бит в ширину, переполнение не произойдет). Следующие значения не инициализируются (мусор из стека) и, следовательно, непредсказуемы.
Необходимый код может быть похож на ответ 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;
}
Все это значения мусора, потому что они не могут найти местоположение вашего txt файла. Дайте полное местоположение, и код будет работать нормально.