Чтение и сохранение целых чисел с помощью scanf в C

У меня есть текстовый файл, который выглядит так:

1 2 4
3 5 2
9 7 6
4 2 6

неизвестного размера до 50 строк.

Я пытаюсь сохранить целые числа в массиве структур

typedef struct column{
int col_1;
int col_2;
int col_3;
} column;

Я создал массив столбца stuct

column column[50];

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


FILE * myfile;
 int i = 0;

if ((myfile = fopen("/home/numbers.txt","r"))==NULL)
{
    printf("File %s not found\n", "/home/numbers.txt");
    exit(0);
}
if ("/home/numbers.txt" == NULL)
{
    printf("There was an error reading %s", "/home/numbers.txt");

}

while(fscanf(myfile,"%d %d %d", &column[i++].col_1, &column[i].col_2, &column[i].col_3) == 3)
{
   printf("\n%d %d %d", column[i].col_1, &column[i].col_2, &column[i].col_3);
}  

Я получаю список таких чисел

    -420921 -420924 -420927

Кажется, это какие-то адреса памяти, потому что они, очевидно, не являются реальными числами.

Моя проблема заключается в том, чтобы получить целые числа, а не некоторые довольно случайные числа, я пробовал & перед переменными в printf, и это не сработало, и наоборот.

Ваша помощь будет принята с благодарностью.


person user476145    schedule 16.12.2010    source источник
comment
связанные с аргументами и порядком функций: поведение   -  person Marcus Borkenhagen    schedule 16.12.2010


Ответы (3)


if ("/home/numbers.txt" == NULL)

... никогда не будет правдой.

Попробуйте немного изменить цикл:

while(i < 50 && fscanf(myfile,"%d %d %d", &column[i].col_1, &column[i].col_2, &column[i].col_3) == 3)
{
   printf("\n%d %d %d", column[i].col_1, column[i].col_2, column[i].col_3);
   i++;
} 

... как есть, вы увеличиваете свой счетчик, в то время как аргументы для scanf определяются, передавая кто знает что.

person sje397    schedule 16.12.2010
comment
вы увеличиваете свой счетчик после чтения первого значения и не читаете правильный индекс для остальных. Не совсем. Ничего не будет прочитано до тех пор, пока функция не будет вызвана, и это после того, как аргументы будут оценены. Так что это не после того, как первое значение прочитано. Но порядок оценки не указан, поэтому вы правы в том, что два других целых числа могут и не могут быть прочитаны с использованием неправильного индекса. - person The Archetypal Paul; 16.12.2010
comment
Спасибо! Это всегда простые вещи! - person user476145; 16.12.2010

Многочисленные вещи здесь не так - это:

if ("/home/numbers.txt" == NULL)
{
    printf("There was an error reading %s", "/home/numbers.txt");

}

не делает ничего толкового - избавьтесь от него. и ваш код цикла имеет неопределенное поведение. Увеличивайте индекс в теле цикла после вывода прочитанных значений.

person unquiet mind    schedule 16.12.2010

похоже, это какие-то адреса памяти, потому что они, очевидно, не являются реальными числами.

Это потому, что вы печатаете адреса!

printf("\n%d %d %d", column[i].col_1, &column[i].col_2, &column[i].col_3);

(кроме col_1, вы/повторно печатаете адрес)

person The Archetypal Paul    schedule 16.12.2010