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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с циклическим файлом на Си 
:(
    Опции темы
Гость_Вова
Дата 11.8.2005, 18:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Люди! Помогите!
Может кто-то умный поможет!

Мне нужно организовать ратоу с циклическим файлом!
То-есть записываю в начало файла запись, затем еще и так далее, пока не запишу, например 20 записей, пишем уже на место первой записи (Понятно, что размер записи одинаковый)

С уважением, Владимир
  Вверх
Fixin
Дата 11.8.2005, 18:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Хм. Мне для примера нужно, так что может напишу.
PM MAIL ICQ   Вверх
Mayk
Дата 11.8.2005, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Если я правильно понял, то что-то типа того
Код

const int recs_per_file=20;
void save_record(FILE* f, record_t* rec, int recn)
{    
    fwrite(f, sizeof(*rec),1,f);
    if(recn % recs_per_file == 0)
        fseek(f,0,SEEK_SET);
}

Ну или rewind(f); вместо fseek'а.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Guest
Дата 11.8.2005, 18:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Плиз! Брось этот пример! Или хотя бы скажи, как организовать удаление первой записи и вместо нее записать новую!
  Вверх
Guest
Дата 11.8.2005, 18:18 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А что fwrite(f, sizeof(*rec),1,f); перезаписывает сверху запись? А не сдвигает записи????
Я думал, что получиться так :

21 запись
1 запись
2 запись
......
20 запись

или я не прав? или получиться:

21 запись
2 запись
......
20 запись ???????

  Вверх
Fixin
Дата 11.8.2005, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Тут нужно использовать функцию seek(). Но я рассчитываю на небольшой файл, потому просто буду копировать исходный по записям и заменять нужную запись, потом переименовывать временный файл в исходный.
PM MAIL ICQ   Вверх
Guest
Дата 11.8.2005, 18:19 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











ЭЭЭЭ, вариант :

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

Не подходит!
ФАЙЛ большой!!!!
  Вверх
Fixin
Дата 11.8.2005, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Цитата
Я думал, что получиться так
Проверь.

Это сообщение отредактировал(а) Fixin - 11.8.2005, 18:21
PM MAIL ICQ   Вверх
Mayk
Дата 11.8.2005, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(Guest @ 11.8.2005, 22:18)
А что fwrite(f, sizeof(*rec),1,f); перезаписывает сверху запись? А не сдвигает записи????

Ну да, перезаписывает.


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
sergejzr
Дата 11.8.2005, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



Mayk нормальный вариант предложил. перезапись части конечно лучше чем всего файла


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Fixin
Дата 11.8.2005, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ёжик
***


Профиль
Группа: Комодератор
Сообщений: 1357
Регистрация: 6.1.2004

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



Думаю, имелось ввиду это:
Код
const int recs_per_file=20;
void save_record(FILE* f, record_t* rec, int recn)
{  
     recn = recn%recs_per_file;
     fseek(f, sizeof(record_t)*recn),SEEK_SET);  
     fwrite(f, sizeof(record_t),1,f);
}


Это сообщение отредактировал(а) Fixin - 11.8.2005, 18:27
PM MAIL ICQ   Вверх
Guest
Дата 11.8.2005, 18:42 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Что-то не работает smile

test = fopen ("test","ab");

s.c[0]='a';
s.c[1]='a';
s.c[2]='a';

rewind(test);

fwrite(&s, sizeof(s), 1, test);

fclose(test);

Пишит в конец файла!!!
  Вверх
comcon1
Дата 11.8.2005, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

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



Код

test = fopen ("test","ab");

Поиграй вторым параметром. Тебе скорее w+, чем а.


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


Unregistered











test = fopen ("test","w+");
Затирает все!!! И пошет сначала
  Вверх
sergejzr
Дата 11.8.2005, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

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



пользуйся fseek им точно можно по всему файлу ходить как вздумается.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Guest
Дата 11.8.2005, 18:52 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











fseek и rewind работают!!!
я проверял :

rewind(test);

fscanf(test,"%c",&first);
fwrite(&s, sizeof(s), 1, test);

но, вот вставляет в конец
  Вверх
Mayk
Дата 11.8.2005, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



RTFMим:
Цитата

"r"
Opens for reading. If the file does not exist or cannot be found, the fopen call fails.
"w"
Opens an empty file for writing. If the given file exists, its contents are destroyed.
"a"
Opens for writing at the end of the file (appending) without removing the EOF marker before writing new data to the file; creates the file first if it doesn't exist.
"r+"
Opens for both reading and writing. (The file must exist.)

"w+"
Opens an empty file for both reading and writing. If the given file exists, its contents are destroyed.
"a+"
Opens for reading and appending; the appending operation includes the removal of the EOF marker before new data is written to the file and the EOF marker is restored after writing is complete; creates the file first if it doesn't exist.
When a file is opened with the "a" or "a+" access type, all write operations occur at the end of the file. The file pointer can be repositioned using fseek or rewind, but is always moved back to the end of the file before any write operation is carried out. Thus, existing data cannot be overwritten.



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Guest
Дата 12.8.2005, 10:54 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Все! Всем спасибо! Все работает! "r+b"
smile smile smile smile
  Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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