Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Очистка содержимого файла


Автор: Джем 25.11.2004, 14:55
Существует ли функция, чтоб осуществить сабж?
Если открываю файл с параметром "w", новое содержимое пишется поверх старого. Но! Если новая переменная меньше чем старая переменная, конечный кусок старой переменной остается.

Автор: sergejzr 25.11.2004, 15:10
http://forum.vingrad.ru/index.php?showtopic=21451

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

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

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

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

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

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

Автор: Crait 25.11.2004, 17:36
Код

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;
}

Автор: Джем 26.11.2004, 08:58
Спасибо, что откликнулись, но функция эта, вообще никак не идет: и 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
Цитата
Спасибо, что откликнулись, но функция эта, вообще никак не идет: и 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);
}




Автор: Джем 26.11.2004, 11:05
Adil'
Цитата
Это он тебе для виндвс написал


То есть для TurboC не пойдет?
И для чего твой код? Чтоб не было EOF? smile

Автор: Adil' 26.11.2004, 12:30
Цитата
То есть для TurboC не пойдет?
нет


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


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

Автор: Mad 26.11.2004, 14:46
Цитата
Ничего от добавления этого кода не изменилось. Может я что не так делаю?

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

Автор: Intro 26.11.2004, 16:05
Зачем всё так сложно?
просто запоминаешь имя файла, потом его удаляешь, потом создаешь поток с именем файла, вот и всё... ;)

Автор: smalcom 26.11.2004, 23:12
точно не помню приблизительно это выглядит так
Код

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

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

Автор: Джем 29.11.2004, 06:48
Цитата(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
Что же ты в одну кучу намешал? 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

Автор: Джем 30.11.2004, 07:12
Adil'
Цитата
Что же ты в одну кучу намешал?

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

Попробовал удалить файл unlink("c:\1.txt"). Таким образом не удаляет. smile

Автор: Adil' 1.12.2004, 11:19
Цитата
unlink("c:\1.txt").
unlink("c:\\1.txt") - заметил разницу?

Автор: Джем 2.12.2004, 10:37
Цитата
unlink("c:\\1.txt") - заметил разницу?

Ага smile , спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)