[c] dopisywanie do pliku

0

Mam nastepujący kod

           
 FILE *zapis;
           zapis=fopen("slowka.txt","w+b");
           fwrite(baza,sizeof(baza),1,zapis);
           fclose(zapis); 

Zapisuje do pliku, ale nie dopisuje danych tylko zawsze nadpisuje.
baza to struktura
Jak ustawie w fopen tryb a+ to ani nie dopisuje ani nie zamienia, pomoże ktoś jak dopisywac zawartosc struktury do pliku aby nie kasowac jego zawartosci i tak aby dało łatwo sie pozniej ja odczytac, teraz dos latwo mi sie odczytuje i zamienia rekordy tylko to dopisywanie, dzieki za jakos pomoc

0

wyrzuć +. pliki powinno się otwierać albo do zapisu, albo do odczytu. jeśli chcesz oba na raz, to znaczy że nie do końca wiesz do czego ci ten plik.
ponieważ tutaj tylko zapisujesz, daj "ab".

0

Oczywiście po dodaniu ab, do pliku nie sa dopisywane ani zamienne żadne wartości(wczesnej juz takze zmieniałem te opcje otwarcia - nie pisał bym wątku)

Po otwarciu w trybie wb do pisku sa dopisywane wartosci ale cala zawartość poprzednia jest zamazywana

maze cala funcja cos pomoze w pomocy dla mnie ;] :

int ADD()
{
        int i = 0;
        int c = 0;
        int ilosc=0;
        
        baza[0].id = 0;
        
        printf("Podaj ile rekordow chcesz dodac(MAX-100)");
        scanf("%d",&ilosc);
        if(ilosc>0 && ilosc <101){              
        for(i = 1; i < ilosc+1; i++)
        {
                baza[i].id = i;
                printf("Podaj nazwe testowa\n");
                scanf("%s", &baza[i].nazwa);
                c++;
        } 
                
           baza[0].count = c;   

           FILE *zapis;
           zapis=fopen("slowka.txt","a+b");
           fwrite(baza,sizeof(baza),1,zapis);
           fclose(zapis);  
           }     

        return 0;
}
0

With the mode specifiers above the file is open as a text file. In order to open a file as a binary file, a "b" character has to be included in the mode string. This additional "b" character can either be appended at the end of the string (thus making the following compound modes: "rb", "wb", "ab", "r+b", "w+b", "a+b") or be inserted between the letter and the "+" sign for the mixed modes ("rb+", "wb+", "ab+").

Skoro nie działa Ci "w+b", to spróbuj "wb+"

0
MJay napisał(a)

With the mode specifiers above the file is open as a text file. In order to open a file as a binary file, a "b" character has to be included in the mode string. This additional "b" character can either be appended at the end of the string (thus making the following compound modes: "rb", "wb", "ab", "r+b", "w+b", "a+b") or be inserted between the letter and the "+" sign for the mixed modes ("rb+", "wb+", "ab+").

Skoro nie działa Ci "w+b", to spróbuj "wb+"

Skoro sie nie czyta postu to jak mozna pomogać? Lepiej wkleić kawałek manuala ...

Ja prosze o pomoc z dopisywaniem do PLIKU!! zapisuje dobrze tylko ze wtedy kasuje cała zawartosc

Umiem czytac dokumentacje ale cos nie umiem ustawić trybu "a" do dopisywanie do pliku

0

Lepiej pojechać po kimś kto radzi, masz rację..
Średnio umiesz czytać jednak tą dokumentację, bo mi jakoś wyszło. Mówiłem Ci, jak nie działa a+b, to użyj ab+

#include <iostream>
using namespace std;

struct baza
{
	int id;
	int costam;
	char cos;
};

int main()
{
	FILE* pFile;
	pFile = fopen("Dupa.dp", "ab+");
	baza b[4];
	for(int i = 0; i < 4; ++i)
	{
		cin >> b[i].id;
		cin >> b[i].costam;
		cin >> b[i].cos;
		fwrite(&b[i], sizeof(baza), 1, pFile);
	}

	fclose(pFile);

	pFile = fopen("Dupa.dp", "rb");
	baza a;
	for(int i = 0; i < 12; i++)
	{
		fread(&a, sizeof(baza), 1, pFile);
		cout << a.cos << " " << a.costam << " " << a.id << endl;
	}

	fclose(pFile);

	system("pause");
	return 0;
}
0

oczywscie wersja z "ab+" nie działa w ogóle nie dopisuje do pliku ani go nie zamienia a z "wb+" działa

Moj kod

         int i = 0;
        int c = 0;
        int ilosc=0;
        
        baza[0].id = 0;
        FILE *zapis;
        zapis=fopen("slowka.txt","ab+");
        printf("Podaj ile rekordow chcesz dodac(MAX-100)");
        scanf("%d",&ilosc);
        if(ilosc>0 && ilosc < 101){              
        for(i = 1; i < ilosc+1; i++)
        {
                baza[i].id = i;
                printf("Podaj nazwe reprezentacji\n");
                scanf("%s", &baza[i].nazwa);
                c++;
                fwrite(&baza,sizeof(baza),1,zapis);
        } 
                
           baza[0].count = c;   


           
           fclose(zapis);  
           }     

        return 0;
0

Nie wiem co ty masz za kompilator, że ab+ nie działa Ci w ogóle. Prawdopodobnie masz problem z tablicą baz.
Proponuję rozwiązanie:

#include <iostream>
using namespace std;

struct baza
{
	int id;
	int costam;
	char cos;
};

int main()
{
	FILE* pFile;
	pFile = fopen("Dupa.dp", "ab+");

	int ilosc;
	printf("Wprowadz liczbe: ");
	scanf("%d", &ilosc);

	baza b;
	for(int i = 0; i < ilosc; ++i)
	{
		scanf("%d", &b.id);
		scanf("%d", &b.costam);
		scanf("%c", &b.cos);
		fwrite(&b, sizeof(baza), 1, pFile);
	}

	fclose(pFile);

	pFile = fopen("Dupa.dp", "rb");
	while(!feof(pFile))
	{
		fread(&b, sizeof(baza), 1, pFile);
		printf("%d %d %c\n", b.cos, b.costam, b.id);
	}

	fclose(pFile);

	system("pause");
	return 0;
}
0
MJay napisał(a)

Nie wiem co ty masz za kompilator, że ab+ nie działa Ci w ogóle. Prawdopodobnie masz problem z tablicą baz.
Proponuję rozwiązanie:

#include <iostream>
using namespace std;

struct baza
{
	int id;
	int costam;
	char cos;
};

int main()
{
	FILE* pFile;
	pFile = fopen("Dupa.dp", "ab+");

	int ilosc;
	printf("Wprowadz liczbe: ");
	scanf("%d", &ilosc);

	baza b;
	for(int i = 0; i < ilosc; ++i)
	{
		cin >> b.id;
		cin >> b.costam;
		cin >> b.cos;
		fwrite(&b, sizeof(baza), 1, pFile);
	}

	fclose(pFile);

	pFile = fopen("Dupa.dp", "rb");
	while(!feof(pFile))
	{
		fread(&b, sizeof(baza), 1, pFile);
		cout << b.cos << " " << b.costam << " " << b.id << endl;
	}

	fclose(pFile);

	system("pause");
	return 0;
}

tylko ze to wersja dla c++ ja juz caly program mam w c dlatego prosil bym o pokazania mi bledu w tej mojej wersji badz przerobienie jakos na c

0

Przerobiłem.

0

Przy kompilacji twojego kodu mam bład nie wiem ja zaradzić
26 C:\Dev-Cpp\main.c `baza' undeclared (first use in this function)

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

struct baza
{
        int id;
        int costam;
        char cos;
};
 
int main()
{
        FILE* pFile;
        pFile = fopen("Dupa.dp", "ab+");
 
        int ilosc;
        printf("Wprowadz liczbe: ");
        scanf("%d", &ilosc);
 int i=0;
        struct baza b;
        for(i = 0; i < ilosc; ++i)
        {
                scanf("%d", &b.id);
                scanf("%d", &b.costam);
                scanf("%c", &b.cos);
                fwrite(&b, sizeof(baza), 1, pFile);
        }
 
        fclose(pFile);
 
        pFile = fopen("Dupa.dp", "rb");
        while(!feof(pFile))
        {
                fread(&b, sizeof(baza), 1, pFile);
                printf("%d %d %c\n", b.cos, b.costam, b.id);
        }
 
        fclose(pFile);
 
        system("pause");
        return 0;
}

0
kiler7 napisał(a)

Przy kompilacji twojego kodu mam bład nie wiem ja zaradzić
26 C:\Dev-Cpp\main.c `baza' undeclared (first use in this function)

To mamy wyjaśniony twój problem. Nie używaj Dev-C++...

0

maze cala funcja cos pomoze w pomocy dla mnie ;] :
twój kod działa, i prawidłowo dopisuje do pliku. coś robisz nie tak, albo spodziewasz się jakiegoś innego efektu niż dostajesz…

0
winerfresh napisał(a)
kiler7 napisał(a)

Przy kompilacji twojego kodu mam bład nie wiem ja zaradzić
26 C:\Dev-Cpp\main.c `baza' undeclared (first use in this function)

To mamy wyjaśniony twój problem. Nie używaj Dev-C++...

Myslałem że dev-c++ to nakladka na gcc i jest najlepszy, visual express c++/c bedzie lepszy?

0

Zdecydowanie. Visual albo Code::Blocks, osobiście polecam Visuala

0
kiler7 napisał(a)
winerfresh napisał(a)
kiler7 napisał(a)

Przy kompilacji twojego kodu mam bład nie wiem ja zaradzić
26 C:\Dev-Cpp\main.c `baza' undeclared (first use in this function)

To mamy wyjaśniony twój problem. Nie używaj Dev-C++...

Myslałem że dev-c++ to nakladka na gcc i jest najlepszy, visual express c++/c bedzie lepszy?

Niebo a ziemia. Jaka nakładka? Dev-C++ to jest niedorobiony zabugowany notatnik, który wymaga sam debuggowania, a wersja GCC z której korzysta powstała chyba przed dinozaurami. Więc tak VC++ to jest na Windows chyba najlepszy wybór.

0

Dzieki przepisze program do visuala od nowa moze to pomoze

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.