Форум программистов CodeGuru
22 Июнь 2018, 09:18:49 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Запись и чтение бинарного файла на Си (помогите найти ошибку!)  (Прочитано 1827 раз)
0 Пользователей и 1 Гость смотрят эту тему.
leon91
Новичок
*
Офлайн Офлайн

Сообщений: 2


Просмотр профиля
« : 15 Декабрь 2012, 03:58:01 »

Доброго времени суток!

Уже какой час бьюсь над проблемой и не могу никак решить ее Грустный

Цитировать
1. Нужно пропарсить данные из текстового файла input.txt следующего формата:

Bari; Nolo acerbam sumere ; 20; 150; 5; 100;
Taranto; Nolo acerbam sumere; 20; 150; 5; 101;
Ancona; Nolo acerbam sumere; 20; 150; 5; 102;
Roma; Nolo acerbam sumere; 20; 150; 5; 103;
Milano; Nolo acerbam sumere; 20; 150; 5; 104;
.....

2. Внести их в структуру, записать в бинарный файл и вывести на экран.

3. Прочесть и отобразить полученный бинарный файл.

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

Листинг программы:

Код:
#include <stdio.h>
#include <stdlib.h>

#define inputfName "input.txt"
#define outputfName "output.txt"

typedef struct
{
char city[40]; // citta'
char hotelName[40]; // nome di albergo
int room1; // numero di stanze singole
int room2; // numero di stanze doppie
float room1Cost; // costo di una stanza singola
float room2Cost; // costo di una stanza doppia
} Alberghi;


void parsingToStruct (FILE *alfa, FILE *beta);
void visualizza (FILE *beta);


int
main()
{
FILE *alfa, *beta;

parsingToStruct (alfa, beta);
visualizza (beta);
}

/* Модуль парсинга и создания бинарного файла */

void
parsingToStruct (FILE *alfa, FILE *beta)
{
Alberghi albergo1;
int n=0;

alfa=fopen(inputfName,"r");
beta=fopen(outputfName, "wb");

if(alfa==NULL)
    printf("Errore");

else {
   
rewind(alfa);

while(fscanf(alfa,"%[^;]; %[^;]; %d; %f; %d; %f;\n",albergo1.city,albergo1.hotelName,&albergo1.room1, &albergo1.room1Cost,&albergo1.room2,&albergo1.room2Cost)!=EOF){
fwrite(&albergo1, sizeof(Alberghi), n, beta);    
printf("\n[%d] %s %s %d %.2f %d %.2f", n, albergo1.city,albergo1.hotelName,albergo1.room1, albergo1.room1Cost,albergo1.room2,albergo1.room2Cost);
n++;
}

fclose(alfa);
fclose(beta);
   
printf("\n\n");
system("pause");
}
}

/* Модуль отображения полученного файла */

void
visualizza (FILE *beta)
{
Alberghi albergo1;
int stato;
int i=1;

beta=fopen(outputfName,"rb");
stato=fread(&albergo1,sizeof(Alberghi),1,beta);

while (stato==1){
printf("\n[%d] %s %s %d %.2f %d %.2f", i, albergo1.city, albergo1.hotelName, albergo1.room1, albergo1.room1Cost, albergo1.room2, albergo1.room2Cost);
i++;
fread(&albergo1,sizeof(albergo1),1,beta);
stato=fread(&albergo1,sizeof(Alberghi),1,beta);
}

fclose(beta);

printf("\n\n");
system("pause");
}
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #1 : 15 Декабрь 2012, 23:16:02 »

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

А какая проблема возникает и конкретно где ?
Под рукой компилятора нет, собрать и запустить программу не могу.
Там, собственно, только fscanf - то самое чтение.
Данные из файла в структуру не попадают или что ?

Если не читается - попробуйте вызывать fscanf с простой строкой формата, т.е. читать строки кусками.
Проверьте, поддерживаются ли scanset-ы и negated scanset-ы (%[^...).
Записан

leon91
Новичок
*
Офлайн Офлайн

Сообщений: 2


Просмотр профиля
« Ответ #2 : 16 Декабрь 2012, 01:50:40 »

Проблема решена! Ошибка была в лишнем fread и неправильном аргументе в fwrite Улыбка Буквально пару строчек рушили вывод программы Улыбка)
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!