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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удалить из файла 10 последних байт? 
V
    Опции темы
Alca
Дата 19.11.2008, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Удалить из файла 10 последних байт?


--------------------
PM WWW ICQ Skype Jabber   Вверх
destrd
Дата 19.11.2008, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



 smile Вы определитесь уже, записываем или удаляем.

Код

FILE *stream;
stream = fopen("file", "rb");
// узнали размер, сколько нам оставить
int size = fseek(stream, 0, SEEK_END) - 10;
// венулись на начало файла
rewind(stream);
char *buf = (char*)malloc(size);
// считали всё, кроме 10 последних байт
fread(buf, size, 1, stream);


fclose(stream);

//Октрыли файл на запись и обрезали его до нулевой длины
stream = fopen("file", "wb+");

// а дальше как обычно.

.
.
.

free(buf);


Это сообщение отредактировал(а) destrd - 19.11.2008, 19:17
--------------------
Some people, when confronted with a problem, think, "I known, I'll use regular expressions." Now they have two problems.        -- Jamie Zawinski in comp.lang.emacs
PM MAIL ICQ   Вверх
warmonger_
Дата 19.11.2008, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(destrd @  19.11.2008,  18:16 Найти цитируемый пост)
char *buf = (char*)malloc(size);

интересное решение) а если файл 4-200 Гб?)
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
destrd
Дата 19.11.2008, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(warmonger_ @  19.11.2008,  19:29 Найти цитируемый пост)
интересное решение) а если файл 4-200 Гб?)

Тогда в цикле по частям
Можно что-то типа sendfile линуксового организовать. Я не знаю под какую операционку пишут. Просто когда дописывали 10 байт, там std::string использовался.

Это сообщение отредактировал(а) destrd - 19.11.2008, 19:40
--------------------
Some people, when confronted with a problem, think, "I known, I'll use regular expressions." Now they have two problems.        -- Jamie Zawinski in comp.lang.emacs
PM MAIL ICQ   Вверх
Alca
Дата 19.11.2008, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Цитата

Вы определитесь уже, записываем или удаляем.

И то и другое надо делать.


--------------------
PM WWW ICQ Skype Jabber   Вверх
inside_pointer
Дата 20.11.2008, 03:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

 
#include <stdio.h>

/* удаляет последние 10 байт из файла */
main()
{
    FILE *fp1, *fp2;    
    long i, maxpos;
    
    if ((fp1 = fopen("file.txt", "rb")) == NULL)       /* файл источник */
        return 1;
    if (fseek(fp1, (-10), SEEK_END) == EOF  
     || (maxpos = ftell(fp1)) == EOF)        /* отмечаем границу в источнике */
        return 2;
    if ((fp2 = fopen("file.txt.tmp", "wb")) == NULL)  /* файл результат */
        return 3;
    
    rewind(fp1);
    for (i = 0; i < maxpos; i++)    /* переносим символы из источника до границы */
        putc(getc(fp1), fp2);
    fclose(fp1);
    fclose(fp2);    
    if (remove("file.txt")      
     || rename("file.txt.tmp", "file.txt"))   /* заменяем источник результатом */
        return 4;
    return 0;
}

проверяет на ошибки, можно смотреть код завершения а можно сообщения к кодам прицепить
PM MAIL   Вверх
dumb
Дата 20.11.2008, 08:34 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Alca, задавай вопросы в правильных разделах.

Код

  HANDLE hFile = CreateFile("somefile.ext", GENERIC_READ|GENERIC_WRITE,
                   FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
  if (hFile != INVALID_HANDLE_VALUE)
  {
    if (SetFilePointer(hFile, -10, NULL, FILE_END) != INVALID_SET_FILE_POINTER)
      SetEndOfFile(hFile);
    CloseHandle(hFile);
  }

PM MAIL   Вверх
Alca
Дата 20.11.2008, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Ещё так можно:
Код

#include <io.h>
if (0 != chsize(fileno(pFile), ulFileSize/*размер файла*/ - 10)) {
    return false;
}


Цитата

Код

char *buf = (char*)malloc(size);

интересное решение) а если файл 4-200 Гб?)

может вместо malloc/free использовать new/delete?

Это сообщение отредактировал(а) Alca - 20.11.2008, 12:45


--------------------
PM WWW ICQ Skype Jabber   Вверх
Mayk
Дата 20.11.2008, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Alca @  20.11.2008,  16:16 Найти цитируемый пост)

может вместо malloc/free использовать new/delete? 

а может все таки лучше использовать указанный SetEndOfFile или ftruncate на юнихах?

зы. нет, в стандарте си таких ф-ций нет.


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


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

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



Всем спасибо.


--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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