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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Очистка содержимого файла, в С 
:(
    Опции темы
Джем
Дата 25.11.2004, 14:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Существует ли функция, чтоб осуществить сабж?
Если открываю файл с параметром "w", новое содержимое пишется поверх старого. Но! Если новая переменная меньше чем старая переменная, конечный кусок старой переменной остается.
  Вверх
sergejzr
Дата 25.11.2004, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


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

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



http://forum.vingrad.ru/index.php?showtopic=21451

Вот тут мы разбирались с подобмым smile
функцией
Код

int truncate (const char*filename, off_t length);

Можно просто укоротить файл на 0 smile


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


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

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



sergej.z
Цитата
Вот тут мы разбирались с подобмым
функцией
Код
int truncate (const char*filename, off_t length);
Можно просто укоротить файл на 0 

Плюс надо добавить библиотеку, в которой эта функция реализована smile

Идея, такова:
1. Отрыть файл
2. Переместить поинтер, при помощи fseek(FILE*, offset, origin), которая очищает признак конца файла
3. Закрыть файл



--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Crait
Дата 25.11.2004, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

int  truncate(const char *fname, int distance)
{
   int i = -1;
   HANDLE hFile = CreateFile(fname, GENERIC_READ | GENERIC_WRITE,
                     FILE_SHARE_READ | FILE_SHARE_WRITE,
                     NULL, OPEN_EXISTING,
                     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,
                     NULL);

   if (hFile != INVALID_HANDLE_VALUE)
   {
       if (SetFilePointer(hFile, distance, NULL, FILE_BEGIN) != 0xFFFFFFFF)
       {
           if (SetEndOfFile(hFile))
               i = 0;
       }

       CloseHandle(hFile);
   }

   return i;
}

PM MAIL   Вверх
Джем
Дата 26.11.2004, 08:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо, что откликнулись, но функция эта, вообще никак не идет: и HANDLE, и GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE и прочие не нравятся моему компилятору. Может какую библиотеку нужно включить?

bel_nikita
Цитата(bel_nikita @ 25.11.2004, 16:01)
Идея, такова:
1. Отрыть файл
2. Переместить поинтер, при помощи fseek(FILE*, offset, origin), которая очищает признак конца файла
3. Закрыть файл


Не понял. Это может помочь вместо предлагаемой функции? Если да, то куда нужно переместить указатель, и каким образом очистить признак конца?

  Вверх
Adil'
Дата 26.11.2004, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
Спасибо, что откликнулись, но функция эта, вообще никак не идет: и HANDLE, и GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE и прочие не нравятся моему компилятору. Может какую библиотеку нужно включить?
Это он тебе для виндвс написал smile
Цитата
Не понял.
bel_nikita, я тоже не понял, что значит "fseek(FILE*, offset, origin), которая очищает признак конца файла"

Код
#include <fcntl.h>
#include<io.h>

int k=open("file.ext",O_BINARY|O_CREAT|O_RDWR|O_TRUNC);
if(k!==-1)
{
 ...
 close(k);
}






--------------------
Удачи
PM MAIL WWW   Вверх
Джем
Дата 26.11.2004, 11:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Adil'
Цитата
Это он тебе для виндвс написал


То есть для TurboC не пойдет?
И для чего твой код? Чтоб не было EOF? smile
  Вверх
Adil'
Дата 26.11.2004, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата
То есть для TurboC не пойдет?
нет


Цитата
И для чего твой код? Чтоб не было EOF?
Причем тут EOF?
open("file.ext",O_BINARY|O_CREAT|O_RDWR|O_TRUNC); с флагом O_TRUNC открывает файл и "урезает" его размер до нуля - то, что ты хотел. Там где, у меня "..." може смело писАть свою переменную - хвост не останется; размер файла будет равен размеру того, что ты запишешь на месте "...".




--------------------
Удачи
PM MAIL WWW   Вверх
Джем
Дата 26.11.2004, 14:34 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Adil'
Ничего от добавления этого кода не изменилось. Может я что не так делаю? А делаю я так:
Сначала открываю файл для записи. Потом идет твой код. В месте "..." идет запись переменных в файл. Закрываю файл. smile
  Вверх
Mad
Дата 26.11.2004, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Эксперт
Сообщений: 656
Регистрация: 18.10.2004
Где: Одесса

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



Цитата
Ничего от добавления этого кода не изменилось. Может я что не так делаю?

Этот код просто должен был сработать.
Посмотри, может ты этот хвостик сам записываеш поновой ?
покажи код, которым ты в файл пишеш.


--------------------
user posted image
PM MAIL   Вверх
Intro
Дата 26.11.2004, 16:05 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Зачем всё так сложно?
просто запоминаешь имя файла, потом его удаляешь, потом создаешь поток с именем файла, вот и всё... ;)
  Вверх
smalcom
Дата 26.11.2004, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



точно не помню приблизительно это выглядит так
Код

open(fd, "filename", O_EXIST | O_TRUNC /*далее по вкусу | O_WRONLY или | O_RDWR*/)

и никакой извините за выражение траханины, если есть файл, то обнулица, если нету, то создасца пустой.


--------------------
What DA F...???
PM MAIL WWW Skype Jabber   Вверх
Джем
Дата 29.11.2004, 06:48 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Mad @ 26.11.2004, 14:46)
покажи код, которым ты в файл пишеш.

Напишу-ка я код всей функции. Функция производит изменения в файле fname, при этом используется временный файл "c:\disk.tmp". До функции изменения файлы открываются: первый - для чтения, второй - для записи.
Код

change_info()
{
int k;
char change;
while (fread(&disk,sizeof(disk),1,f))
  {
    clrscr();
    printf("Name of disk - %s\n",disk.name);
    printf ("Singer - %s\n",disk.singer);
    printf ("Category of disk - %s\n",disk.category);
    printf ("Cost (tenge)- %s\n",disk.cost);
    puts ("\nTo change disk information press \"C\"");
    puts("To go to the next disk press any key");
    for (;;)
       {
  change=toupper(getch());
  if (change!='C') {fwrite(&disk,sizeof(disk),1,t);break;}
  else
     {
 clrscr();
 puts("Name of disk");
 scanf("%s",&disk.name);
 puts ("Singer");
 scanf("%s",&disk.singer);
 puts ("Category of disk");
 scanf("%s",&disk.category);
 puts ("Cost (tenge)");
 scanf("%s",&disk.cost);
 if ((fwrite(&disk,sizeof(disk),1,t))==0)
    {
      puts("Error of writing information in file");
      getch();
      exit(0);
    }
  break;
        }
        }
     }
fclose(f);
f=fopen(fname,"w");
fclose(t);
t=fopen("c:\disk.tmp","r");

k=open(fname,O_CREAT|O_RDWR|O_TRUNC);
if(k!=-1)
{
while (fread(&disk,sizeof(disk),1,t))
   {fwrite(&disk,sizeof(disk),1,f);}
close(k);
}
fclose(f);
fclose(t);
}

Но, похоже, дело в чем-то другом. Делаю проверку. Отдельной функцией заношу данные в первый файл. Второго пока не существует. Выполняю функцию изменения. Смотрю результат: первый файл, как обычно... НО И во временном файле почему-то записаны не новые переменные, а такая же ерунда - новые поверх старых. smile


Цитата(Intro @ 26.11.2004, 16:05)
потом его удаляешь

Каким образом можно удалить файл программно?
  Вверх
Adil'
Дата 29.11.2004, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Что же ты в одну кучу намешал? smile Весь код не смотрел, а вот хвост поправь:
Код
  ...
  fclose(f);
  //f=fopen(fname,"w"); - не надо
  fclose(t);
  t=fopen("c:\disk.tmp","r");
  k=open(fname,O_CREAT|O_RDWR|O_TRUNC);//если читать не надо, то вместо O_RDWR можно O_WRONLY
  if(k!=-1)
  {
     while (fread(&disk,sizeof(disk),1,t))
       write(k,&disk,sizeof(disk));//для записи используй k
     close(k);
  }
  //fclose(f); - не надо
  fclose(t);
}
Вообще, имхо, принято для бинарных файлов использовать open, write, read и т.п., а для текстовых - fopen, fprintf, fgets и т.п.
Цитата
Каким образом можно удалить файл программно?
unlink или _unlink



--------------------
Удачи
PM MAIL WWW   Вверх
Джем
Дата 30.11.2004, 07:12 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Adil'
Цитата
Что же ты в одну кучу намешал?

Да уж получилось масло масляное. smile
А выяснилось, что если просматривать файл каким текстовым редактором, то там новые переменные записаны поверх старых и их конец остается, а если просматривать этот же файл программно, то все пучком - никакой лишней информации. Странно...

Попробовал удалить файл unlink("c:\1.txt"). Таким образом не удаляет. smile
  Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0677 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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