[C]Problem z działaniem trybu r+


(K Ilak) #1

Witam,

Z tego co wiem tryb r+ służy do odczytywania i dopisywania, tymczasem obserwuje, że jeśli coś wczytuje to potem nie moge już dopisywać do pliku. Jeśli się mylę, proszę tym bardziej o pomoc.

 

FILE *plik;
plik=fopen("data.dat", "r+");
char tekst[20000];
int i=0;
fgets(tekst, 20, plik);
fprintf(plik, "test");
fclose(plik);
break;

 


(kostek135) #2

Ten kod dopisuje bez problemu do pliku.

#include <stdio.h>

int main() {
	FILE *plik;
	plik=fopen("data.dat", "r+");
	
	char tekst[100];

	fgets(tekst, 20, plik);
	fprintf(plik, "test");
	fclose(plik);

	return 0;
}

Kompilowane przez:

plik data.dat w tym samym katalogu, co plik wykonywalny.


(enedil) #3

Może to problem z alokacją tak dużej tablicy?


(K Ilak) #4

Nie wiem, nie działa… a kod skopiowałem dosłownie od @kostek135

 

Stosuje Dev-Cpp, w Code::Blocks to samo… co jest?

 

Jakieś propozycje?


(nintyfan) #5

Może plik, do którego chcesz dopisać jest pusty? W takim wypadku, to zachowanie może różnić się w zależności od systemu operacyjnego, gdyż wskaźnik pliku wskazuje za jego końcem. Uniksy, z tego, co pamiętam, powinny początek pliku wypełnić zerami, ale pewny nie jestem.


(K Ilak) #6

Plik jest zapisany, sprawdzałem nawet pod innym windowsem, nic z tego, próbuje pod DevCpp, ktoś mógłby też spróbować? 


(fedora24x) #7

tu masz odpowiedź :slight_smile: (poniższy link, pod koniec pdfa)

http://we.pb.edu.pl/~adam_i/PWJWP_ps_2.pdf

a te tak na przyszłość:

https://pl.wikibooks.org/wiki/C/Czytanie_i_pisanie_do_plik%C3%B3w
http://we.pb.edu.pl/~ketim/ketim-md/ed_3_INF/INF2_22.pdf

(K Ilak) #8

Niestety, również z operacją fopen_s i trybem rt nie działa. 


(kostek135) #9

Dobra tak sobie uświadomiłem, że trochę za bardzo się zasugerowałem tym co napisałeś oraz umieściłem tylko jedną linijkę tekstu do przetestowania, stad wydawało mnie się, że jest OK.

To co robi twój/mój kod, to wczytuje pierwszą linię tekstu (o ile jest mniejsza niż buffor) fgets przerywa wczytywanie, gdy napotka NL albo EOF i następnie ponieważ jest ustawiony w trybie “r+” to zaczniesz pisać po drugiej linijce (nadpisując ją - replace). Wprowadź 3 linijki tekstu tak, by 2 linia w pliku była inna niż ten stały tekst w kodzie i zobacz efekty.

Jeśli chcesz coś dokleić na koniec używając “r+” to musisz przeiterować plik, tak aby wskaźnik wylądował na jego końcu (do napotkania EOF) i dopiero zacząć pisać, albo ustawić tryb “a” (append) i wtedy zaczniesz po prostu dopisywać do pliku na końcu.