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


Автор: rujmaster 9.4.2009, 16:26
Написать программу, осуществляющую чтение из текстового файла данных в массив структур 
и последующий вывод этого массива в двоичный файл. 

Содержимое текст файла:

Вася    5А    4.8
Петя    6А    8.8
Зина    5А    4
Ваня    5Б    8.9
Сережа    5А    4.4

Код:
Код

#include <stdio.h>
int main() {
char tmp[30];
char tmp1[30];
char tmp2[30];
    FILE *fp;
if ((fp = fopen("rost.txt", "r")) == NULL) {
printf("error\n");
return 1;
}
fscanf(fp, "%s", tmp);
fscanf(fp, "%s", tmp1);
fscanf(fp, "%s", tmp2);

printf("%s ", tmp);
printf("%s ", tmp1);
printf("%s \n", tmp2);
return 0;
}

Данный вариант выводит только первую строку. Как осуществить вывод всех строк в массив, если их число заранее неизвестно. Также непонятно, каким образом осуществлять вывод массив в двоичный файл. Помогите разобраться  smile



Автор: Anikmar 9.4.2009, 16:31
Цитата(rujmaster @  9.4.2009,  16:26 Найти цитируемый пост)
Как осуществить вывод всех строк в массив, если их число заранее неизвестно.

Использовать структуру + vector

Цитата(rujmaster @  9.4.2009,  16:26 Найти цитируемый пост)
Также непонятно, каким образом осуществлять вывод массив в двоичный файл. 

Дело техники - вывод структур в файл.

Создайте структуру с описанием одной строки, затем последовательно счиайте из файла и добавляйтие в вектор.

Автор: rujmaster 9.4.2009, 18:26
Саму суть вроде понял, правда как вбивать массив в двоичный файл так и не дошло, поэтому пока что заменил выводом массива на экран. Вот что получилось:
Код


#include <stdio.h>
int main() {
    int i;


    struct  {
        char name[10];
        char klas[2];
        float number; } sp1, a[30];



    FILE *fp;
    if ((fp = fopen("rost.txt", "r")) == NULL) {
        printf("error\n");
        return 1;
    }

    i=0;
    while (1) {
    fscanf (fp, "%s", sp1);
    if ((fscanf (fp, "%s", sp1))==-1) {
    break;
    }

    a[i]=sp1;
    i++;
    }

    for (i=0;i<30;i++) {
        printf ("%s ", a[i]);
    }
    return 0;
}

Все компилирует, но программа вывлаивается с ошибкой. 

Автор: zim22 9.4.2009, 19:14
Код

fscanf (fp, "%s", &sp1);


Код

printf ("%s ", a[i]);

у вас a - массив структур. 
выводите в printf каждое поле отдельно.
Код

printf ("%s %s %d", a[i].name, a[i].klas, a[i].number);

Автор: Annihilator 9.4.2009, 19:18
Начнем с того, что функция принимает указатели, поэтому
Код

fscanf (fp, "%s", &sp1);

Цитата(rujmaster @  9.4.2009,  22:26 Найти цитируемый пост)
как вбивать массив в двоичный файл

Как-то так
Код

FILE* f = fopen("file", "wb");
fwrite((char*)&i1, sizeof(i1), 1, f);
fclose(f);

 А вообще у тебя плохая реализация - считываешь сколько есть и... все в структуру(!)
у тебя первые 10 байт запишуться в 
Код

char name[10];

потом еще 2 в
Код

char klas[2];

а далее вообще белиберда, только благо что POD-структура

Автор: rujmaster 9.4.2009, 19:23
а как тогда правильно обьявить структуру?smile

Автор: Anikmar 9.4.2009, 22:53
Цитата(rujmaster @  9.4.2009,  19:23 Найти цитируемый пост)
а как тогда правильно обьявить структуру? 

Объявлена правильно - считывание неправильно.
Необходимо считывать по-отдельности каждое поле. Как-то так:
Код

    i=0;
    while (!feof(fp)) 
{
    fscanf (fp, "%s", a[i].name);
    fscanf (fp, "%s", a[i].klass);
    fscanf (fp, "%f", &a[i++].number);
 }

Автор: rujmaster 10.4.2009, 09:20
Вот, вроде работает, все считывает и нормально выводит на экран. smile

Код


#include <stdio.h>
int main() {
    int i;


    struct  {
        char name[20];
        char klass[20];
        char number[20];} a[23], sl;



    FILE *fp;
    if ((fp = fopen("rost.txt", "r")) == NULL) {
        printf("error\n");
        return 0;
    }
    
    i=0;
    while (!feof(fp)) {
        fscanf(fp,"%s", &a[i].name);
        fscanf(fp, "%s", &a[i].klass);
        fscanf(fp, "%s", &a[i].number);
    
        i++;
    }


    for (i=0;i<23;i++) {
        printf ("%-6s ", a[i].name);
        printf ("%s ", a[i].klass);
        printf ("%s\n", a[i].number);
    
    }
return 0;
}

НО возник вопрос с записью в двоичныи файл. Как я понял: fread(s1, s2, s3, s4)
где s1-указатель на данные, s2- размер ОДНОГО элемента, s3- число элементов, s4 -выходной поток. Если у меня данные представлены в виде массива структур, что берется за 1 элемент? И как наити число этих элементов?

Автор: rujmaster 10.4.2009, 14:43
Кажется, разобрался. проверьте, пожалуйста  smile 
Код


#include <stdio.h>
int main() {
    int i;


    struct {
        char name[20];
        char klass[20];
        char number[20];} a[23];
        



    FILE *fp;
    if ((fp = fopen("rost.txt", "r")) == NULL) {
        printf("error\n");
        return 0;
    }
    
    i=0;
    while (!feof(fp)) {
        fscanf(fp,"%s", &a[i].name);
        fscanf(fp, "%s", &a[i].klass);
        fscanf(fp, "%s", &a[i].number);
    
        i++;
    }


    for (i=0;i<23;i++) {
        printf ("%-6s ", a[i].name);
        printf ("%s ", a[i].klass);
        printf ("%s\n", a[i].number);
    
    }
    fclose(fp);

    

    fp=fopen("rost_binary.txt" , "wb");

    for (i=0;i<23;i++) {

        fwrite((char*)&a[i].name, sizeof(a[i].name), 1 ,fp);
        fwrite((char*)&a[i].klass, sizeof(a[i].klass) , 1 ,fp);
        fwrite((char*)&a[i].number, sizeof(a[i].number) ,1 , fp);
    }
    
    fclose(fp);
    return 0;
}

Автор: Anikmar 10.4.2009, 16:57
Цитата(rujmaster @  10.4.2009,  14:43 Найти цитируемый пост)
fwrite((char*)&a[i].name, sizeof(a[i].name), 1 ,fp);

Что это за наворот? Вам нужен char* - у поля структуры name - тип char[20] - при использования без индекса только имени массива будет char*, никаких преобразований не нужно, НО
В двоичный файл можно записать структуру одной командой:
fwrite((char*)&a[i], sizeof(a[i]),...

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