Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

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


Ответ
 
Опции темы
Старый 07.01.2015, 02:09   #1
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию Почему fseek чистит файл?

Есть структурка
Код:
struct Cinema
{
    char name[len];
    char director[len];
    char genre[len];
    int year;
    int duration;
    int rank;
};
Запишем ее в начало файла, сразу прочтем и удостоверимся, что нормально записалось
Код:
 Cinema temp;
    temp.year = 1234;
    FILE *file = fopen(filename,"wb");
 

    int blocksWrote;
    printf("%d\n", blocksWrote);
    fseek(file,0*sizeof(Cinema),SEEK_SET);
    blocksWrote = fwrite((char*)&temp, sizeof(temp), 1, file);
    printf("%d\n", blocksWrote);
    fclose(file);
    printf("%d -------\n", temp.year);
    temp.year = 4321;
    printf("%d -------\n", temp.year);

    file = fopen(filename,"rb");
    blocksWrote = fread((char*)&temp, sizeof(temp), 1, file);
    printf("%d\n", blocksWrote);
    fclose(file);
    printf("%d -------\n", temp.year);
Далее, если выполнить вот такой участок кода
Код:
 FILE *file = fopen(filename,"wb");

    fseek(file,1*sizeof(Cinema),SEEK_SET);
fclose(file);
Первая записаная структура (первые sizeof(Cinema) байт) будет перезаписана 0.
Почему ?
Hemul вне форума Ответить с цитированием
Старый 07.01.2015, 09:20   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,538
По умолчанию

Почитайте что делает с файлом ключ w в функции fopen.
pu4koff вне форума Ответить с цитированием
Старый 07.01.2015, 10:41   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Думаю этот пример может помочь: http://www.programmersforum.ru/showthread.php?t=105501
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.01.2015, 12:31   #4
Hemul
Форумчанин
 
Регистрация: 03.10.2010
Сообщений: 321
По умолчанию

Разобрался. Нужно открывать с "r+b" (обновление файла с чтением и записью), потому что "w+b"(то же самое обновление с чтенем/записью) чистит файл (логика мне не очень понятна)

Ист : http://www.cplusplus.com/reference/cstdio/fopen/
Hemul вне форума Ответить с цитированием
Старый 07.01.2015, 12:59   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,840
По умолчанию

Цитата:
потому что "w+b"(то же самое обновление с чтенем/записью) чистит файл
А-а-а... Это моя ошибка. Согласен. В том примере было не критично, и я как-то не обратил на это внимание.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Fseek() для ifstream Евгений1988 Общие вопросы C/C++ 1 17.11.2014 09:37
Функции fseek, _fseeki64 MishkaSh Помощь студентам 10 02.10.2013 11:59
Нужно исправить код! Файлы,cи, fseek ленок-носок Помощь студентам 4 24.03.2012 22:59
заморочки функций fseek и fwrite tiger() C++ Builder 2 25.04.2011 13:31
fseek вместо дополнительного массива (язык Си) velvetdust Помощь студентам 3 25.06.2009 21:32