Wczytywanie danych linia po linii

0

Witam. Proszę o pomoc, poradę, w jaki sposób mogę wczytywać tekst z pliku linia po linii? Potrzebne jest mi to do programu, który byłby swego rodzaju dziennikiem szkolnym. W pliku pojedyncza linia byłaby poświęcona jednemu uczniowi (nazwisko, imię, oceny - wszystko rozdzielone spacją). Klasa byłaby reprezentowana za pomocą tablicy struktur (nazwisko, imię, oceny). Proszę o radę, jak wczytywać dane do struktury? Nie przychodzi mi do głowy żaden pomysł, jak po przejściu do następnej struktury (ucznia) nie zaczynać czytania pliku od początku.

1

A ten plik bazodanowy ma przechowywać informacje w plain text?
Wracając do pytania, to poczytaj o getline(). Dane w wierszu pliku (imię, nazwisko, oceny, itd) oddziel jakimś separatorem. W aplikacji wczytaj cały plik do pamięci, wykonaj potrzebne operacje, a następnie zapisz plik. Raczej nie bawiłbym się w edycje poszczególnych linii w pliku.

0

Są dwie możliwości.
Możesz rozdzielać informacje z pliku podczas czytania linijki albo najpierw zczytać całą linijkę a dopiero potem rozdzielić na poszczególne parametry.

W C++ jest troszeczkę łatwiej bo funkcja getline ma możliwość podania jako trzeciego argumentu separatora, czyli do jakiego znaku ma czytać.

Edit:

W pliku:

Jan Kowalski 4.5
Damian Nowak 5.0
#include <stdio.h>
#include <stdlib.h>

struct Student{
    char name[20];
    char surname[20];
    float srednia;
}typedef Student;

void readParamFromFile(FILE *file, Student students){
    while(fscanf(file,"%s %s %f", students.name, students.surname, &students.grade)>0) {
        printf("%s %s %f\n", students.name, students.surname, students.grade);
    }
}

int main(){
 FILE *plik = fopen("abcd.txt","r");

 Student students[2];

 readParamFromFile(plik,students[0]);
 readParamFromFile(plik,students[1]);
}

0

@PanRiK: Może coś źle zrozumiałem, ale mógłbyś mi wyjaśnić, dlaczego w fscanf przed students.grade jest '&', a przed students.name i students.surname tego operatora nie ma? Program rzecz jasna wypisuje zawartość pliku.
Prosiłbym też Was o radę w jeszcze jednej kwestii: program ma czytać dane z kilku plików. Jak można w takiej sytuacji dopisywać oceny osobie, której dane były wczytane już wcześniej? Wiem, że potrzebna jest mi tablica na oceny, przyda się strcmp, natomiast nie wiem, jak to wszystko zastosować tak, by porównywanie następowało na bieżąco (a może lepiej zapisać wszystko jak leci, posortować, a potem scalić identyczne imiona i nazwiska, by na końcu przesunąć całą resztę tak, by nie pozostawić luki?). Będę wdzięczny za każdą podpowiedź.
Jeszcze takie małe pytanie: czy fscanf w przypadku braku któregokolwiek elementu (imienia, nazwiska lub oceny) zwraca jakiś błąd, jak np. scanf, gdy otrzyma nieprawidłową wartość zmiennej?

0

Fscanf , dokumentacja mówi o jego argumentach:

int fscanf(FILE *stream, const char *format, ...);

name oraz surname są to tablice, a jak wiemy tablica jest adresem pierwszego jej elementu. Potrzebujemy jeszcze adresu grade dlatego operator adresu:).

Edit: Aby rozwiązać wszystkie Twoje problemy albo przynajmniej uprościć ich rozwiązanie - zainteresuj się czymś takim jak baza danych

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