Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите, пожалуйста, с задачей 
:(
    Опции темы
rujmaster
Дата 9.4.2009, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



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

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

Вася    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



PM MAIL   Вверх
Anikmar
Дата 9.4.2009, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



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

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

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

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

Создайте структуру с описанием одной строки, затем последовательно счиайте из файла и добавляйтие в вектор.
PM MAIL ICQ   Вверх
rujmaster
Дата 9.4.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



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


#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;
}

Все компилирует, но программа вывлаивается с ошибкой. 
PM MAIL   Вверх
zim22
Дата 9.4.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Код

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


Код

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

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

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


Это сообщение отредактировал(а) zim22 - 9.4.2009, 19:17


--------------------
PM MAIL   Вверх
Annihilator
Дата 9.4.2009, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


bytegrinder
**


Профиль
Группа: Участник
Сообщений: 493
Регистрация: 21.11.2006
Где: Омск

Репутация: 1
Всего: 3



Начнем с того, что функция принимает указатели, поэтому
Код

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-структура


--------------------
Если вы не можете сделать хоpошyю пpогpаммy, сделайте, чтобы она по кpайней меpе выглядела хоpошо
PM ICQ   Вверх
rujmaster
Дата 9.4.2009, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



а как тогда правильно обьявить структуру?smile
PM MAIL   Вверх
Anikmar
Дата 9.4.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(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);
 }


Это сообщение отредактировал(а) Anikmar - 9.4.2009, 22:53
PM MAIL ICQ   Вверх
rujmaster
Дата 10.4.2009, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Вот, вроде работает, все считывает и нормально выводит на экран. 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 элемент? И как наити число этих элементов?
PM MAIL   Вверх
rujmaster
  Дата 10.4.2009, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 9.4.2009

Репутация: нет
Всего: нет



Кажется, разобрался. проверьте, пожалуйста  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;
}

PM MAIL   Вверх
Anikmar
Дата 10.4.2009, 16:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 5
Всего: 59



Цитата(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]),...
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0798 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.