wczytywanie danych pliku tekstowego i ich interpretacja

0

Witam,mam ćwiczenia w książce w rozdziale o strukturach napisać program,nie ważne jakie ma on zastosowanie. Ale jeden jego element ma wczytywać z pliku tekstowego dane,dane w pliku są zapisane tak:
nr Imie Nazwisko liczba1 liczba2 liczba3 liczba 4

Rzecz jasna ze Imie i nazwisko ma byc zapisane jako lancuch do tablicy,a nr i liczby jako liczby całkowite int,i teraz nie bardzo sobie moge z tym poradzić,według mnie plik nalezy otworzyć w trybie tekstowym(nie binarnym) i ewentualnie przetwarzać znaki na liczby,chyba że możecie mi jakoś pomóc,bo jakbym otworzył w trybie binarnym i korzystał z funkcji fread() to przecież komputer nie wiedzialby czy zapisuej on liczbe czy znak odstepu

a o to część,a właściwie początek programu:

#include <stdio.h>
#include <string.h>
#define ROZ 19

struct zawodnik
{
       int numer;
       char imie[15];
       char nazwisko[15];
       int rzuty;
       int pkt;
       int asysty;
       int faule;
       float skutecznosc;
};






int main(void)
{
    struct zawodnik gracze[ROZ];
    FILE*plik;
    int i;
    
    for (i=0;i<ROZ;++i)
    { gracze[i].numer=0; gracze[i].rzuty=0; gracze[i].pkt=0; gracze[i].asysty=0; gracze[i].faule=0; gracze[i].skutecznosc=0.0; };
    
    if ( (plik=fopen("plik.txt","r"))==NULL) {puts("Blad otwarcia pliku");getchar();exit(1);}
    
    
    /*Miejsce na wczytanie danych*/
    
    
    
    
    if ( (fclose(plik))==EOF) {puts("Blad zamknięcia pliku");getchar();exit(1);}
    
    
    
    
    puts("\n\nKoniec");
    getchar();
    getchar();
    return 0;
}
0

Takie dwie opcje mi przychodza do glowy, jak chcesz czytac normalnie, a nie binarnie.

	while(fgets(line, 128, fp)) // char line[128], fp = fopen("asd.txt", "r")
	{
		cos.num = atoi(strtok(line, " "));
		strcpy(cos.name, strtok(NULL, " "));
		strcpy(cos.surn, strtok(NULL, " "));
		cos.a = atoi(strtok(NULL, " "));
		
		printf("%d %s %s %d\n",
			cos.num, cos.name, cos.surn, cos.a );
	}
	while(fscanf(fp, "%d %s %s %d\n", 
		&cos.num, &cos.name, &cos.surn, &cos.a) != EOF) 
	{
		printf("%d %s %s %d\n",
			cos.num, cos.name, cos.surn, cos.a);
	}
0

no a jeżeli bym czytał binarnie? Przecież to jest niemożliwe odczytać plik tekstowy w trybie binarnym co nie?

0
mateuszek1992 napisał(a)

no a jeżeli bym czytał binarnie? Przecież to jest niemożliwe odczytać plik tekstowy w trybie binarnym co nie?

Mozliwe, mozesz sobie leciec w petli, biale znaki traktowac jako odstepy i w ten sposob sobie przetwarzac.

0

no ok,już sobie poradziłem w miarę z tym,powstał taki kod:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define ROZ 19

struct zawodnik
{
       int numer;
       char imie[15];
       char nazwisko[15];
       int rzuty;
       int pkt;
       int asysty;
       int faule;
       float skutecznosc;
};






int main(void)
{
    struct zawodnik gracze[ROZ];
    FILE*plik;
    int i=0;
    
    
    for (i=0;i<ROZ;++i)
    { gracze[i].numer=0; gracze[i].rzuty=0; gracze[i].pkt=0; gracze[i].asysty=0; gracze[i].faule=0; gracze[i].skutecznosc=0.0; };
    
    if ( (plik=fopen("plik.txt","rb"))==NULL) {puts("Blad otwarcia pliku");getchar();exit(1);}
    
    i=0;
    fscanf(plik,"%d",&gracze[0].numer);    
    fscanf(plik,"%s %s %d %d %d %d",&gracze[i].imie,&gracze[i].nazwisko,&gracze[i].rzuty,&gracze[i].pkt,&gracze[i].asysty,&gracze[i].faule);    
    printf("%d %s %s %d %d %d %d",gracze[i].numer,gracze[i].imie,gracze[i].nazwisko,gracze[i].rzuty,gracze[i].pkt,gracze[i].asysty,gracze[i].faule);
    
    
    if ( (fclose(plik))==EOF) {puts("Blad zamknięcia pliku");getchar();exit(1);}
    
    
    
    
    puts("\n\nKoniec");
    getchar();
    getchar();
    return 0;
}

A linijka w pliku wygląda następująco:
11 Michael Jordan 14 10 8 5

0

teraz mam tylko pytanie,bo ja sobie tryb binarny wyobrażam tak,ze komputer widzi same liczby,i gdybym użył funkcji fread() to by był kompletny bajzel,bo przecież dane są zapisane w postaci liczb,a funkcja fread() nie przetwarza danych na kod ASCII,bo przecież mimo iż "11" które ma być interpretowane jako liczba int nie jest zapisane jako liczba 11 tylko jako dwa znaki o kodzie 49,a wiec i sa zapisane w pliku jako dwie liczby 49,i tutaj według mnie właśnie całą robotę wykonuej funkcja fscanf która odczytuje dane i przetwarza je albo na liczbę całkowitą,albo na łańcuch zgodny z ASCII,dobrze rozumuje ze tak powiem?:P

bo w ogóle według mnie stosowanie funkcji fread() i fwrite() do pliku tekstowego nie ma sensu nie?:P

0

Dlaczego? Można tak przeczytać wszytko. Tekst też jest zapisany binarnie - jeden znak to jeden bajt (zakładając, że to nie jest unicode).

0

a mam jeszcze jedno pytanie,czemu pobierając łańcuch nie został w nim umieszczony znak odstępu?

0

a,ok,czaje,bo funkcje typu xscanf przy pobieraniu lancuchow nie pobieraja znakow nie drukowanych zgadza sie?

0
mateuszek1992 napisał(a)

teraz mam tylko pytanie,bo ja sobie tryb binarny wyobrażam tak,ze komputer widzi same liczby,

Różnica jest jedynie taka, że w trybie binarnym nie są rozpoznawane znaki nowej linii jako takie. Na linuksie/uniksie tryb binarny, tekstowy nie jest w ogóle rozróżniany.

0

no właśnie,wiec jaki tryb jest na tych systemach,tylko binarny czy tylko tekstowy?

0
mateuszek1992 napisał(a)

a mam jeszcze jedno pytanie,czemu pobierając łańcuch nie został w nim umieszczony znak odstępu?

raczej dlatego, ze w funkcjach typu *scanf whitespace są domyślnymi separatorami pól danych.. po prostu scanf stwierdza w domysle ze napis jest az-do-spacji i potem jest DRUGI napis.

no właśnie,wiec jaki tryb jest na tych systemach,tylko binarny czy tylko tekstowy?

Są dostępne oba, z tym drobnym faktem, że obsluga trybu tekstowgo jest identyczna z obsluga trybu binarnego. Na win/mac juz tak nie jest. *nixy sa przypadkiem specjalne, gdyz niech terminator linii to jeden bajt, nie dwa, jak na win/mac

0

ale jak w scanf uzyje specyfikator %c to wtedy juz biale znaki beda odczytywanie nie?:P

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