Program do zapisywania pacjentów w pliku

0

Siemka. Mam taki kod:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define N 50
#define M 1

struct dane{
	char imie[N];
	char nazwisko[N];
	int wiek;
	char plec;
	char adres[50];
	char pesel[N];
	int numer;	
};

void wprowadz_pacjenta(struct dane[]);
void zapisz_pacjenta(struct dane[]);
void znajdz_pacjenta(struct dane[]);


int main()
{
	struct dane baza[M];
	int x,i;
	do{
		puts("Program umozliwia nastepujace opcje:");
		puts("1 - Wprowadz pacjenta");
		puts("2 - Zapisz pacjenta");
		puts("3 - Znajdz pacjenta");
		puts("4 - Wyjscie z programu\n");
	
		do{
			puts("Wybierz opcje: ");
			scanf("%d", &x);
		}while(x>4 || x<1);
			switch(x)
			{
				case 1:
					{
						wprowadz_pacjenta(baza);
						break;
					}
				case 2:
					{
						zapisz_pacjenta(baza);
						break;
					}
				case 3:
					{
						znajdz_pacjenta(baza);
						break;
					}
				case 4:
					{
						exit(1);
						break;
					}
			}
			fflush(stdin);
	}while(x!=4);
	return 0;
}

void wprowadz_pacjenta(struct dane baza[])
{
	int i;
	char imie[N];
	char nazwisko[N];
	int wiek;
	char plec;
	char adres[N];
	char pesel[N];
	int numer;
	
	for(i=1;i<=1;i++)
	{
		puts("Podaj imie: ");
		gets(imie);
		strcpy(baza[i].imie, imie);
		fflush(stdin);
      	
		puts("Podaj nazwisko: ");
		gets(nazwisko);
		strcpy(baza[i].nazwisko, nazwisko);
		fflush(stdin);
		
		puts("Podaj wiek: ");
		scanf("%d", &wiek);
		baza[i].wiek = wiek;
		fflush(stdin);
		
		puts("Podaj plec");
		scanf("%c", &plec);
		baza[i].plec = plec;
		fflush(stdin);
		
		puts("Podaj adres: ");
		gets(adres);
		strcpy(baza[i].adres, adres);
		fflush(stdin);
		
		puts("Podaj PESEL: ");
		gets(pesel);
		strcpy(baza[i].pesel, pesel);
		fflush(stdin);
		
		puts("Podaj numer choroby: ");
		scanf("%d", &numer);
		baza[i].numer = numer;
		fflush(stdin);
	}
}

void zapisz_pacjenta(struct dane baza[])
{
	FILE *fp;
	int i;
	if((fp=fopen("Pacjenci.txt", "a+"))==NULL)
	{
		puts("Blad otwarcia pliku");
		exit(1);
	}
	for(i=1;i<=M;i++)
	{
		fprintf(fp, "Imie /t Nazwisko /t Wiek /t Plec /t Adres /t Pesel /t Numer choroby");
		fprintf(fp, "%s /t %s /t %d /t %c /t %s /t %s /t %d /t", baza[i].imie, baza[i].nazwisko, baza[i].wiek, baza[i].plec, baza[i].adres, baza[i].pesel, baza[i].numer);
	}
	fclose(fp);
}

I teraz problemy z którymi nie potrafię sobie poradzić... :D :

  1. Po odpaleniu programu i wybraniu opcji numer 1 pomija zapytanie o imię i od razu pyta o nazwisko. Nie wiem o co chodzi... xd
  2. Kiedy wybieram opcję numer 2 to zapisuje mi w pliku chińskie znaczki.
    Póki co to wszystko, chociaż nie wiem czy dalej nie będę miał jeszcze problemów :D
    Z góry dzięki za pomoc :)
1

Ad.1) Zapewne w strumieniu siedzi \n po wcześniejszym scanf. Wyrzuć go np. za pomocą getc/fgetc.
Ad.2). Po wcześniejszym wpisaniu kogoś?

gets jest jest już chyba kompletnie usunięte z C11. Zastąp je fgets
I wiesz, że możesz wczytywać dane bezpośrednio tam gdzie chcesz bez konieczności tymczasowych zmiennych a następnie kopiowania?

printf( "Podaj imie: ");
fgets( baza[ i ].imie, N, stdin );

W funkcji zapisującej pomerdały Ci się slashe. Zamiast /t powinno być \t.

0

W poprzednim kodzie w 1. wyczyściłem buffor po scanfie i działa. Z drugim problemem niestety nie umiem sobie poradzić. Kiedy już podam dane osoby i zapiszę je w pliku, otwieram ten plik, a tam chińskie znaczki.

Zacząłem pisać kolejny kod (wrzucę go tutaj, bo w sumie jest bardzo podobny do poprzedniego, a nie chcę zaśmiecać forum) :

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define N 50
#define MAKS 1

struct ksiazka{
	char nazwisko[N];
	int kierunkowy;
	char numer[N];
};

void dodaj_numer(struct ksiazka[]);
void wypisz_dane(struct ksiazka[]);
void zapisz_w_pliku(struct ksiazka[]);
void wczytaj_z_pliku(struct ksiazka[]);

int main()
{
	struct ksiazka baza[MAKS];
	int x,i;
	
	do{
		puts("Program umozliwa nastepujace funkcje: \n");
		puts("1 - Dodaj numer");
		puts("2 - Wypisz dane");
		puts("3 - Zapisz dane w pliku");
		puts("4 - Wczytaj dane z pliku");
		puts("5 - Wyjscie z programu\n");
		
		do{
			printf("Wybierz jedna z opcji: ");
			scanf("%d", &x);
			//printf("Wybrales opcje %d\n", x);
			printf("\n");
			fflush(stdin);
		}while(x>5 || x<1);
		
		switch(x)
		{
			case 1:
				{
					dodaj_numer(baza);
					break;
				}
			case 2:
				{
					wypisz_dane(baza);
					break;
				}
			case 3:
				{
					zapisz_w_pliku(baza);
					break;
				}
			case 4:
				{
					wczytaj_z_pliku(baza);
					break;
				}
			case 5:
				{
					exit(1);
					break;
				}
		}
	fflush(stdin);
	}while(x!=5);
	return 0;
}

void dodaj_numer(struct ksiazka baza[])
{
	int i;
	int kierunkowy;
	char nazwisko[N];
	char numer[N];
	for(i=1;i<=MAKS;i++)
	{
		printf("Podaj nazwisko: ");
		gets(nazwisko);
		strcpy(baza[i].nazwisko, nazwisko);
		fflush(stdin);
		
		printf("Podaj numer kierunkowy: ");
		scanf("%d", &kierunkowy);
		baza[i].kierunkowy = kierunkowy;
		fflush(stdin);
		
		printf("Podaj numer: ");
		gets(numer);
		strcpy(baza[i].numer, numer);
		fflush(stdin);
		printf("\n");
	}
}

void wypisz_dane(struct ksiazka baza[])
{
	int i;
	for(i=1;i<=MAKS;i++)
	{
		printf("Nazwisko: %s \n", baza[i].nazwisko);
		printf("Numer: %d %s\n", baza[i].kierunkowy, baza[i].numer);
		printf("\n");
	}
}

void zapisz_w_pliku(struct ksiazka baza[])
{
	FILE *fp;
	int i;
	
	if((fp=fopen("Ksiazka.txt", "ra+"))==NULL)
	{
		puts("Blad otwarcia pliku");
		exit(1);
	}
	for(i=1;i<=MAKS;i++)
	{
		fprintf(fp,"Nazwisko \t Kierunkowy \t Numer");
		fprintf(fp,"\n");
		fprintf(fp,"%s \t\t %d \t\t %s", baza[i].nazwisko, baza[i].kierunkowy, baza[i].numer);
		puts("Numer zostal dodany do ksiazki\n");
	}
	fclose(fp);
}


void wczytaj_z_pliku(struct ksiazka baza[])
{
	FILE *fp;
	char ksiazka[N];
	int i;
	
	if((fp = fopen("ksiazka.txt","rt"))== NULL)
	{
		printf("Blad otwarcia pliku");
		exit(1);
    }
	while(fscanf(fp,"%s",&ksiazka)!=EOF)
		printf("%s\n", ksiazka);
	printf("\n");
	fclose(fp);
}

Tutaj raczej wszystko dobrze, poza tym, że kiedy podam nazwisko i później chce je wyświetlić lub sprawdzić w pliku, to wyskakuje/jest tam kwadrat ze znakiem zapytania w środku. Ktoś coś? :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1