Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2011, 01:35   #1
jack291
 
Регистрация: 20.08.2011
Сообщений: 3
По умолчанию Чтение и запись структуры в бинарный файл.

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

вот что получилось:

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

struct notebook
{   
    int x;
    int y;
    int f;
    float d;
    float hdd;
    char model[21];
};

int main()
{
    FILE *fi, *fo;
    notebook s;
    if((fi=fopen("input","r"))==0) {return 1;}
    if((fi=fopen("output","w+b"))==0) {return 1;}
    const int dl=80;
    char buff[dl];
    int kol = 0;

    while(fgets(buff,dl,fi))
    {
        strncpy(s.model,buff,20);
        s.model[20]='\0';
        s.f=atoi(&buff[21]);
        s.x=atoi(&buff[25]);
        s.y=atoi(&buff[30]);
        s.d=atof(&buff[35]);
        s.hdd=atof(&buff[40]);
        kol++;
    }
    fclose(fi);
    int i=0;
    for(i;i<kol;i++);
    {
        fseek(fo,(sizeof s)*i,SEEK_SET);
        fread(&s,sizeof s,1,fo);
        std::cout<<s.model<<" "<<s.f<<" "<<s.x<<"x"<<s.y<<" "<<s.d<<" "<<s.hdd<<"\n";
    }

    fclose(fo);
    return 0;
}
Входной файл: input.txt
jack291 вне форума Ответить с цитированием
Старый 20.08.2011, 03:33   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

начнём с того что в вашем файле квадратики откуда-то вместо переноса строки.

Цитата:
Сообщение от jack291 Посмотреть сообщение
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cstdio> и т.д

Цитата:
Сообщение от jack291 Посмотреть сообщение
if((fi=fopen("input","r"))==0) {return 1;}
if((fi=fopen("output","w+b"))==0) {return 1;}
1. надо писать имя файла с расширением ("input.txt", "output.bin")
2. правильно писать wb+ , и почему + ?, вам же просто wb
3. 2 раза открыли 1 файл

Цитата:
Сообщение от jack291 Посмотреть сообщение
strncpy(s.model,buff,20);
s.model[20]='\0';
s.f=atoi(&buff[21]);
s.x=atoi(&buff[25]);
s.y=atoi(&buff[30]);
s.d=atof(&buff[35]);
s.hdd=atof(&buff[40]);
kol++;
бгг. самонадеянно) чиселки типа 20 35...
мм.. без разделителей будет не очень хорошо файл парсить.
было бы очень хорошо сделать разделители например
вместо строки "Acer Note Light 2699 1024x0768 2200 120."
сделать "Acer Note Light : 2699 : 1024x0768 : 2200 : 120."
в таком случае я бы советовал сделать так:
Код:
sscanf(buff,"%[^:] :  %d : %dx%d : %d : %d",s.model,&s.f,&s.x,&s.y,&s.d,&s.hdd);
1 строчка вместо всего гемора .

далее запись вообще сделана плохо. имхо проще считывать и сразу же записывать в вых. файл.
то есть вместо этого:

Цитата:
Сообщение от jack291 Посмотреть сообщение
while(fgets(buff,dl,fi))
...
...
fseek(fo,(sizeof s)*i,SEEK_SET); // брр... жесть
fread(&s,sizeof s,1,fo); // почему fread ?? и забыли приведение типа
std::cout<<s.model<<" "<<s.f<<" "<<s.x<<"x"<<s.y<<" "<<s.d<<" "<<s.hdd<<"\n";
}
сделать примерно так (и счетчик ни к чему):
Код:
    while(fgets(buff,dl,fi))
    {
     sscanf(buff,"%[^:] :  %d : %dx%d : %d : %d",s.model,&s.f,&s.x,&s.y,&s.d,&s.hdd);
     fwrite((char*)&s,sizeof(s),1,fo);
    }
ну и отладочный вывод можете сделать))

Последний раз редактировалось onewho; 20.08.2011 в 03:38.
onewho вне форума Ответить с цитированием
Старый 20.08.2011, 18:07   #3
jack291
 
Регистрация: 20.08.2011
Сообщений: 3
По умолчанию

Цитата:
начнём с того что в вашем файле квадратики откуда-то вместо переноса строки.
Пользуюсь линуксом, видимо из за этого проблемы.

Цитата:
1. надо писать имя файла с расширением ("input.txt", "output.bin")
опять таки линукс.

Цитата:
3. 2 раза открыли 1 файл
Ой, опечатался...

Цитата:
#include <cstdio> и т.д
QT Creator требует .h, #include <cstdio> не сущетвует.

Цитата:
бгг. самонадеянно) чиселки типа 20 35...
Забыл сказать, что текст в файле отморматирован, т.е. имя занимает 20 символов вместе с пробелами, и т.д.

за остальное спасибо) Всё работает чудненько

Последний раз редактировалось jack291; 20.08.2011 в 18:23. Причина: исправление орфографии))
jack291 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запись в бинарный файл Shepard90 Общие вопросы C/C++ 2 28.06.2011 08:59
с++ запись в бинарный файл ofstream::write Farrel Общие вопросы C/C++ 1 25.11.2010 00:19
Чтение и запись структуры в бинарный файл Bed Alice Общие вопросы C/C++ 1 09.11.2010 21:17
Считывание и запись структур в бинарный файл TheKnyazz Общие вопросы C/C++ 7 10.11.2009 13:47
запись классов в бинарный файл Feannewedd Общие вопросы C/C++ 6 29.06.2009 10:11