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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Чтение массива структур из бинарного файла 
:(
    Опции темы
vladko
Дата 7.12.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Бинарный файл состоит из заголовка:
Код

struct HistoryHeader
  {
   int               version;
   char              copyright[64];
   char              symbol[12];
   int               period;
   int               digits;
   time_t            timesign;
   time_t            last_sync;
   int               unused[13];
  };

и массива структур:
Код

#pragma pack(push,1)
struct RateInfo
  {
   time_t            ctm;
   double            open;
   double            low;
   double            high;
   double            close;
   double            vol;
  };
#pragma pack(pop)


читаю заголовок и 1 структуру из массива.
Код

struct HistoryHeader s;
struct QuoteInfo q;
....
stream = fopen("c:\\1.dat", "r");
 
   fread(&s, sizeof(s), 1, stream);
   fread(&q, sizeof(q), 1, stream);


Как прочитать оставшиеся до конца файла структуры и изменить последнюю?
PM MAIL   Вверх
t_gran
Дата 8.12.2009, 04:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Цитата

Как прочитать оставшиеся до конца файла ...

Код

while (!eof(stream))
{
   fread(&s, sizeof(s), 1, stream);
   fread(&q, sizeof(q), 1, stream);
   // ... обработка
}


Цитата

... и изменить последнюю


А вот с этим проблемка. Придёться переписывать файл, т.к. в Си нет такой возможности заменять данные в файле. По крайней мере ни разу не встречал. Добавить можно, но не изменить.
Код

stream= fopen("c:\\1.dat", "ab+"); // открыть для чтения и записи в конец


Это сообщение отредактировал(а) t_gran - 8.12.2009, 04:43


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
vladko
Дата 8.12.2009, 06:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо.
Может быть на каком-нибудь другом языке программирования возможно изменять файл?
PM MAIL   Вверх
Dancer
Дата 8.12.2009, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

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



Цитата(t_gran @  8.12.2009,  04:40 Найти цитируемый пост)
в Си нет такой возможности заменять данные в файле.

вроде бы можно переместиься в определённое место, и оттуда уже производить запись. разьве нет?
peek(), fseek()

что-то вроде, c конца, вернулись на sizeof(q) и переписали эту структуру.
fseek(stream, -sizeof(q), SEEK_END);
fwrite(&new_q, sizeof(q), 1, stream);
fclose(stream);

Это сообщение отредактировал(а) Dancer - 8.12.2009, 11:51


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
mr.Anderson
Дата 8.12.2009, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


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

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




 ! 
mr.Anderson
Модератор: название темы должно содержать язык написания!



--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
t_gran
Дата 9.12.2009, 05:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



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

А то, что я пробовал, вот:
Код

#include <stdio.h>

int main (int argc, char **argv)
{
   FILE *f= fopen("file.txt", "ab+");
   if (!f)
   {
      puts("error: file not found ...");
      return 1;
   }
   char *qwe= "qwerty";
   fwrite(qwe, 6, 1, f);
   fseek(f, 0, SEEK_SET);
   fwrite("!", 1, 1, f);
   fclose(f);
   return 0;
}

И к моему сожалению получаю
Код

qwerty!


Это сообщение отредактировал(а) t_gran - 9.12.2009, 05:08


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Dancer
Дата 9.12.2009, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 29.4.2005
Где: Nizhniy Novgorod

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



Код

#include <stdio.h>

int main (int argc, char **argv)
{
    // "r+" will open a text file to read from or write to.
    // "w+" will create a text file to read from or write to.
    // Add a "b" to the end if you want to use binary files instead of text files, like this:
    // "rb", "wb", "ab", "r+b", "w+b", "a+b".

   FILE *f= fopen("file.txt", "r+b");
   if (!f)
   {
      puts("error: file not found ...");
      return 1;
   }

   char *qwe= "qwerty"; // 6 byte

   fseek(f, 0L, SEEK_END);
   fwrite(qwe, 6, sizeof(char), f);

   fseek(f, -1L, SEEK_END);
   fwrite("!2345", 2, sizeof(char), f); // write "!" and "2" only to file

   fseek(f, 0L, SEEK_SET);
   fwrite("SSS", 3, sizeof(char), f);

   fflush(f);
   fclose(f);

   return 0;
}



Это сообщение отредактировал(а) Dancer - 9.12.2009, 14:02


--------------------
У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! smile
PM MAIL   Вверх
t_gran
Дата 10.12.2009, 03:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

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



Dancer, +1. Моей ошибкой был параметр a+b.


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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