Wyświetlanie pliku txt na ekranie

0

Witam, muszę wyświetlić plik txt na ekranie, program się kompiluje, po podaniu nazwy pliku wyświetlani nie to co trzeba, tzn kwadraciki i inne znaki., zawartość pliku jest zupełnie inna. W czym problem?

void wyswietl()
{
   struct osoba person;
	char nazwa[256];
	FILE *plik;
	printf("Podaj nazwe pliku: ");
 	fflush(stdin);
 	gets(nazwa);
 	strcat(nazwa, ".txt");
 	if((plik = fopen(nazwa,"a")) == NULL)
 	{
 	fputs("Nie moge otworzyc pliki\n", stderr);
 	exit(1);
 	}
    else
    {
 		fread(&person,sizeof(struct osoba), 1, plik); 
 		fclose(plik);
 		printf("%s | %s | %d\n",person.imie, person.nazwisko, person.numer);
    }
	system("PAUSE");
}
 
0

Ano same problemy:

  1. otwierasz w trybie "a", i chcesz czytać?
  2. czytasz plik tekstowy tak jak należy czytać binarny. fread(&person,sizeof(struct osoba), 1, plik); - odczyt binarny
0

tryb "a" rozumiem że jest źle, powinno być r, r+, w+, a+.
Ale jak się odczytuje pliki textowe w C?
tą funkcję którą załączyłem to fragment programu naszej doktórki która uczy C. czyżby miała błędy?

0

powinieneś wczytywać z formatowaniem fscanfem a plik otworzyć w trybie "rt"

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

struct osoba
{
	char imie[40];
	char nazwisko[40];
	int numer;
};
void dodaj();
void popraw();
void wyswietl();
void usun();
int main ()
 { 
 	char znak;
 	do
 	{
 		printf("Menu:\n");
		printf("a-add\n");
		printf("c-correct\n");
		printf("s-show\n");
		printf("d-delete\n");
		printf("e-exit\n");
		printf("\nPodaj znak:\n");
		scanf("%c", &znak);
		switch(znak)
		{
			case'a': dodaj(); break;
			case'c': popraw(); break;
			case's': wyswietl(); break;
			case'd': usun(); break;
			case'e': break;
		}
		system("cls");
 	}while(znak!='e');
 	return 0;
 }
 void usun()
 {
 	int znak;
 	char nazwa[256];
 	printf("Podaj nazwe plik: ");
 	fflush(stdin);
 	gets(nazwa);
 	strcat(nazwa,".txt");
 	printf("Czy na pewno usunac plik o nazwie %s? Jesli tak wcisnij 1.\n", nazwa);
 	scanf("%d", &znak);
 	if(znak==1)
 	remove(nazwa);
 }
 void dodaj()
 {
 	FILE *plik;
 	struct osoba person;
 	char nazwa[256];
 	char string[40];
 	fflush(stdin);
 	puts("Podaj nazwe pliku:");
 	scanf("%s", &nazwa);
 	strcat(nazwa,".txt");
 	if((plik = fopen(nazwa,"wb")) == NULL)
 	{
 	fputs("Nie moge otworzyc pliki\n", stderr);
 	exit(1);
 	}
 	puts("Podaj Imie: ");
 	fflush(stdin);
 	scanf("%39[^\n]s", string);
 	strcpy(person.imie, string);
 	puts("Podaj Nazwisko: ");
 	fflush(stdin);
 	scanf("%39[^\n]s", string);
 	strcpy(person.nazwisko, string);
 	puts("Podaj numer : ");
 	fflush(stdin);
 	scanf("%d",&person.numer);
 	fwrite(&person,sizeof(struct osoba), 1, plik);
 	printf("Osoba dodana poprawnie!\n");
 	system("Pause");
 	fclose(plik);
}
void popraw()
{
	struct osoba person;
	FILE *plik;
	char nazwa[256];
	printf("Podaj nazwe pliku: ");
 	fflush(stdin);
 	gets(nazwa);
 	strcat(nazwa, ".txt");
 	if((plik = fopen(nazwa,"rb")) == NULL)
 	{
 	fputs("Nie moge otworzyc pliku\n", stderr);
 	exit(1);
 	}
    else
   	{
   	fwrite(&person,sizeof(struct osoba), 1, plik);
   	fclose(plik);
   	printf("%s %s %d\n",person.imie,person.nazwisko,person.numer);
	}
	if((plik = fopen(nazwa,"wb")) == NULL)
 	{
 	fputs("Nie moge otworzyc pliki\n", stderr);
 	exit(1);
 	}
 	puts("Podaj Imie: ");
 	fflush(stdin);
 	gets(person.imie);
 	puts("Podaj Nazwisko: ");
 	fflush(stdin);
 	gets(person.nazwisko);
 	puts("Podaj numer : ");
 	scanf("%d", &person.numer);
 	fprintf(plik, "%s | %s | %d\n", person.imie, person.nazwisko, person.numer);
 	fclose(plik);
	
}
void wyswietl()
{
	struct osoba person;
	char nazwa[256];
	FILE *plik;
	printf("Podaj nazwe pliku: ");
 	fflush(stdin);
 	gets(nazwa);
 	strcat(nazwa, ".txt");
 	if((plik = fopen(nazwa,"r")) == NULL)
 	{
 	fputs("Nie moge otworzyc pliku\n", stderr);
 	exit(1);
 	}
    else
   	{
   	fwrite(&person,sizeof(struct osoba), 1, plik);
   	fclose(plik);
   	printf("%s %s %d\n",person.imie,person.nazwisko,person.numer);
    }
    
	system("PAUSE");

}

Załączam cał program który powienien chyba działać ale zamiast tekstu wyświetla kwadraciki. Wydaje mi się że dobrze napisałem go.

0

Czytanie z pliku liniami w C:

 FILE *plik;
    plik = fopen(nazwaPliku, "r");
    if (plik == NULL)
    {
        fprintf(stderr, "Blad, nie udalo sie otworzyc pliku %s!\n", nazwaPliku);
        exit(-1);
    }

    while(!feof(plik))
    {
        fgets(bufor, sizeof(bufor), plik);
        fprintf(stdout, "%s\n", bufor);
    }

    fclose(plik);
0

Ale możemy tylko używać fread, fwrite, wymóg dohtórki.:) fgetsami,fsnafami i fprintfami umiem zrobić, ale nie wiem jak za pomocą fread, fwrite., tzn wiem ,ale program działa niepoprawnie.

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