[ANSI C] funkcja remove ()

0

Witam!

Mam następujący problem. Mianowicie, chcę sobie utworzyć w programie plik tymczasowy. No więc tworzę... wykonuje na nim różne operacje (read, write, add) i na koniec chciałbym go usunąć. Niestety funkcja remove() nie skutkuje i wyrzuca błąd Error deleting file: Permission denied

Co może być powodem?

Dodam, że jeżeli stworzę sobie jakiś programik na boku z poleceniem remove(), to bez problemu kasuje.

0

Może nie konczysz pracy z tym plikiem poprzez zamknięcie go? W ten sposób twój program nadal z niego korzysta i nie mozna go usunąć?

0

sprawdzalem po 10 razy wlasnie to ;) ale to nie to. Wlasnie zrobilem kilka testow i jestem pewien, ze to przez operacje dodawania do pliku:

fp=fopen("temp.txt","a");

bo w sytuacji, gdy do pliku nic nie dodaje, moge go usunac bez problemu.

0

ponowie pytanie Shalom'a - a ten 'fp' potem zamykasz?

0

tak jak wyzej napisalem :) sprawdzalem kilka razy czy na pewno gdzies nie przeoczylem zamkniecia (bo plik jest otwierany w wielu funkcjach). Jest wszedzie zamkniety.

0
Puzon napisał(a)

tak jak wyzej napisalem :) sprawdzalem kilka razy czy na pewno gdzies nie przeoczylem zamkniecia (bo plik jest otwierany w wielu funkcjach). Jest wszedzie zamkniety.
Na 99% gdzieś ci uciekło zamknięcie pliku.

0

Cały czas nie mogę sobie poradzić więc wrzucam tutaj przykładowy, prosty programik. Liczy się to, że wyrzuca właśnie ten błąd.

#include<stdio.h>
#include<stdlib.h>

int main() {

	FILE *fp;
	int i = 3; 

/* dla testu petla przeleci 3 razy */
	while(i--) {

/* funkcja dziala tak, ze jesli plik byl juz wczesniej utworzony, to dodaje tylko nowa linijke, natomiast jesli nie byl - tworzy nowy plik */
		if((fp=fopen("test.txt", "r"))==NULL) {
			fclose(fp);
			fp=fopen("test.txt", "w");
			fprintf(fp, "ten tekst zostanie wpisany zaraz po utworzeniu pliku\n");
			fclose(fp);
		} else {
			fp=fopen("test.txt", "a");
			fprintf(fp, "ten tekst zostanie dodany, jesli plik istnial wczesniej!\n");
			fclose(fp);
		}

	}

/* proba usuniecia pliku */
	if( remove( "test.txt" ) != 0 ) perror( "Error deleting file" );
	else puts( "File successfully deleted" );

	return 0;
}

Spróbujcie skompilować i uruchomić. Po wykonaniu nie powinno być pliku "test.txt" (powinien zostać usunięty pod koniec programu).

0

JAAAAAAAAAAAAAAAAAAAAAAAAAAAA ale.... juz widze :D
zapomnialem po } else { dodac fclose()

myslalem ze nigdy sie z tym nie uporam. glupie kilka literek ;P

wszystko juz dziala, dzieki

0
#include <stdio.h>
#include <stdlib.h>

int main()
{
  FILE *fp;
  int i = 3;
  /* dla testu petla przeleci 3 razy */
  while (i--)
    {
      /* funkcja dziala tak, ze jesli plik byl juz wczesniej utworzony, to dodaje tylko nowa linijke, natomiast jesli nie byl - tworzy nowy plik */
      if ((fp=fopen("test.txt", "r"))==NULL)
        {
          fclose(fp);
          fp=fopen("test.txt", "w");
          fprintf(fp, "ten tekst zostanie wpisany zaraz po utworzeniu pliku\n");
          fclose(fp);
        }
      else
        {
          fclose(fp); //a tu zamknięcie pliku otwartego w ifie to koza zjadła?
          fp=fopen("test.txt", "a");
          fprintf(fp, "ten tekst zostanie dodany, jesli plik istnial wczesniej!\n");
          fclose(fp);
        }
    }
  /* proba usuniecia pliku */
  if ( remove( "test.txt" ) != 0 )
    perror( "Error deleting file" );
  else
    puts( "File successfully deleted" );
  return 0;
}

0

Ten fragment (zamykanie NULLA) jest poprawny?

      if ((fp=fopen("test.txt", "r"))==NULL)
      {
          fclose(fp);
         ...
</cpp>
Na moim komputerze nie.
0

zamykanie NULLa jest bezsensowne od tego trzeba zacząć :P

0

Zgoda, ale wykonanie instrukcji bezsensownej jest niegroźne - najwyżej trochę spowolni program.
Natomiast

   fp=NULL;
   fclose(fp);

powoduje błąd wykonania i kończy program, co może mieć bardzo nieprzyjemne konsekwencje.

0

z tego co pamietam, na linuksie sigsegv, na windows - leci poprawnie, bo fclose ma test na nullptr w srodku