Działanie na plikach C

0

Witam.

Mam napisać program, który pobiera z pliku (plik1.txt) dane o osobie zapisane w jednej linii (imię nazwisko wiek(w miesiącach)) po czym zapisuje do innego pliku (plik2) tylko imię i nazwisko osób mających więcej niż 4 i mniej niż 18 lat. Problemem jest to, że nie wiem ile osób jest wpisanych do pliku1. Program się kompiluje ale po uruchomieniu czeka chwilę, po czym wyskakuje komunikat, e program przestał działać.

Mój kod wygląda tak:


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

struct osoba
    {
        char imie[20];
        char nazwisko[30];
        int wiek;
    };

int main()
    {
        struct osoba kartoteka[100], max;
        FILE *plik1, *plik2;
        int i, l;
        char j;

        plik1=fopen("plik1.txt", "rt");
        while( (j = fgetc(plik1)) != EOF)
                {
                    if ( j == '\n')
                    l++;
                }
        fseek ( plik1, 0 , SEEK_SET );
        for (i = 0; i < l; i++)
            {
                fscanf(plik1, "%s", kartoteka[i].imie);
                fscanf(plik1, "%s", kartoteka[i].nazwisko);
                fscanf(plik1, "%d", &kartoteka[i].wiek);
            }
        fclose (plik1);
        for ( i = 0; i < l; i++)
        kartoteka[i].wiek = kartoteka[i].wiek/12;
        printf("Osoby podejrzane: \n");
        for (i = 0; i < l; i++)
            {
                printf("%s %s lat %d\n", kartoteka[i].imie, kartoteka[i].nazwisko, kartoteka[i].wiek);
            }
        plik2 = fopen("plik2.txt", "wt");
        for (i = 0; i < l; i++)
            {
                if (kartoteka[i].wiek > 4 && kartoteka[i].wiek < 18)
                fprintf(plik2, "%s %s\n", kartoteka[i].imie, kartoteka[i].nazwisko);
            }
        fclose (plik2);
        getchar();
    }

Proszę o wskazanie błędu i poprawienie go w kodzie, lub sugestie jak to poprawić :)

0

proponuję wczytywanie i zapis zrobić mniej więcej tak (zmien sobie nazwy zmiennych):

while (fscanf(plik1,"%s%s%d",imie,nazwisko,&wiek)==3) //scanf/fscanf zwraca ilosc wczytanych elementow
  {
    printf("%s %s lat %d\n", imie,nazwisko,wiek);
    fprintf(plik2, "%s %s\n", imie, nazwisko);
  }
0

Błąd znaleziony, wykluczony i wszystko teraz działa.
Mianowicie wystarczyło
l = 0;przed zliczeniem wierszy :)

0
Timtirimtim napisał(a):

Błąd znaleziony, wykluczony i wszystko teraz działa.
Mianowicie wystarczyło
l = 0;przed zliczeniem wierszy :)

co nie zmienia tego że Twój program będzie wolniejszy, będzie zajmował znacznie więcej pamięci, a nawet nie będzie miał szansy działać przy bardzo dużych plikach
lepiej zmień podejście na zaproponowane przez krwq

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