Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Массив структур массивов


Автор: BlackJohnnie 26.4.2012, 04:48
Доброго всем утра! 
Сразу извиняюсь за, скорее всего, не рациональное решение проблемы но:
1) требуется создать массив, состоящий из структур, в которых некоторые типы - массивы.
2) требуется считать данные из файла и тупо скопировать их в другой файл с помощью fprintf(конечно, мне не нужно копировать файл, но на данном этапе нужно понять, почему код виснет при исполнении)

Код


#include "stdafx.h"
#include <stdio.h>

int main()
{
    int i,k,m,n,q;
    struct ST {
        int Price[40];
        int Value[40];
    } arr[100];

    FILE *input;
    FILE *output;
    char* file_name_in = "train.txt";
    char* file_name_out = "out.txt";
    
    input = fopen (file_name_in, "r");
    output = fopen (file_name_out, "w");
    for (i=0;i<100;i++)
    {    
        for (k=0;k<40;k++)
        {    
            arr[i].Price[k] = 0;
            arr[i].Value[k] = 0;

        fscanf(input, "%d %d\n", arr[i].Price [k], arr[i].Value [k]);
        fprintf(output, "%d %d \n",arr[i].Price[k] ,arr[i].Value[k]); 
        }
    }
    
    fclose (input);
    fclose (output);
    return 0;
}





А этот код не виснет:

Код

#include "stdafx.h"
#include <stdio.h>

int main()
{
    int i,k,m,n,q;
    struct ST {
        int Price[40];
        int Value[40];
    } arr[100];

    FILE *input;
    FILE *output;
    char* file_name_in = "train.txt";
    char* file_name_out = "out.txt";
    
    input = fopen (file_name_in, "r");
    output = fopen (file_name_out, "w");
    for (i=0;i<100;i++)
    {    
        for (k=0;k<40;k++)
        {    
            arr[i].Price[k] = 0;
            arr[i].Value[k] = 0;
        fscanf(input, "%d %d\n", arr[i].Price, arr[i].Value);
        fprintf(output, "%d %d \n",arr[i].Price[k] ,arr[i].Value[k]); 
        }
    }
    
    fclose (input);
    fclose (output);
    return 0;
}



Разница только в том, тчо во втором случае нет индексов массивов в fscanf'е.
Помогите, пожалуйста!
Заранее спасибо!

Автор: disputant 26.4.2012, 06:56
Что-то мне подсказывает, что в функцию fscanf после форматной строки надо передавать адреса, куда класть данные...

Код

fscanf(input, "%d %d\n", &arr[i].Price [k], &arr[i].Value [k]);


А во втором случае, убрав индексы, вы передали адреса первых элементов массивов. Вот оно и заработало smile

Автор: BlackJohnnie 26.4.2012, 07:30
Спасибо! Действительно, отправляя в scanf адресса, получаем работающий код.
Но теперь другая проблма, уже по самому коду. В файл output программа сначала записывает верное предполагаемыое значение (для i=0 и k=0), а затем выводит два фиксированных значения для arr[i].Price[k] и для arr[i].Value[k], при этом нормально пробегая все возможные значения i и k.

Автор: disputant 26.4.2012, 09:16
Гм, а что за файл вы ей подсовываете? 

Выходной файл должен по сути совпадать со входным, и у меня, когда я подсунул исправленной программе файл с 4000 парами значений по паре в строке, все прошло на ура...
Может, у вас входной файл не совсем...?

Автор: BlackJohnnie 26.4.2012, 10:49
Спасибо большое! Действительно проблема в файле: в каждой строке после двух десятичных значений находится ещё и некоторые символы.
Ещё раз большое спасибо!
Проблема, решена)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)