Funkcja sprawdzająca liczbę rekordów w pliku .txt

0

Witam ;)
Potrzebuję kodu na funkcję, która sprawdza liczbę rekordów/ wierszy w pliku tekstowym.

int wiersze(FILE *plik){
 
        int wiersz=0;
        char znak;
 
        while((znak = getc(plik)) != EOF) {
                if(znak == '\n')
                        ++wiersz;
        }  
   return wiersz;
} 

to mi dobrze liczy, ale coś przy okazji się psuje, bo przy sprawdzaniu warunku

 if( feof( stream ) != 0){
                        fclose( stream );
                        break; 

wychodzi z pętli for i kończy program. A kiedy zakomentuję tą funkcję i w for wstawiam, zamiast tego co zwróciła funkcja, powiedzmy 5, to jest wszystko ok ;) Nie działa nawet wtedy, kiedy funkcja jest po prostu wywołana i się wykona. Nie używam wtedy nawet zmiennej z tym co zwróciła funkcja.

0

drugi if jest źle (po co to feof). Na dodatek najprawdopodobniej ten if jest zbędny i powinien się łaczyć ze wcześniejszym kodem, którego nie widać.

0

ten drugi if tu jest w ogóle od czapy (pomijając to, że zamknąć plik należy niezależnie, czy dojdzie do końca, czy nie, jeśli już z niego nie korzystamy), to używa jakiejś nowej zmiennej - więc w sumie nie wiadomo co to ma robić.

0

Dobra, zabrakło rewinda. Ale problemy są nadal. Wklejam cały kod: (aktualizowany x2)
Tak mi działa. Został problem z wartościami nie całkowitymi punktów.

 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int wiersze(FILE *plik){
 
        int wiersz=0;
        char znak;
 
        while((znak = getc(plik)) != EOF) {
                if(znak == '\n')
                        ++wiersz;
        }  
   return wiersz;
}
 
struct student{
        int nr_ID;
        char nazwisko[20];
        char imie[20];
        double punkty;
};
int main(){
 
       
        struct student *tab;
        char plik[10];
        int i=0,n=0;
                FILE *stream;
 

        printf("Podaj nazwe pliku, ktory chcesz otworzyc:\n");
        scanf("%s",plik);
        strcat(plik, ".txt");
 
stream=fopen(plik,"r");
 
 
if(stream==NULL){
        printf("Blad przy otwieraniu pliku.\n");
}else{
        printf("Wczytano plik\n");
}
n = wiersze(stream);
printf("n=%d", n);
n=n+1;
rewind(stream);

tab = (struct student *)malloc(n*sizeof(struct student));
 if (fgetc(stream) == EOF)
		{
			printf("\nPlik jest pusty!\nKoniec programu\n");
			fclose(stream);
			system("pause");
			return 0;
		}
		else
		{
			rewind(stream); //jesli plik nie jest pusty, przewijamy kursor na poczatek pliku
		}
 printf("\n\nZawartosc %s:\n\n", plik);
	
 
 while (!feof(stream)) {
	 for(i=0;i<n;i++){
	 fscanf( stream,"%d%s%s%d", &tab[i].nr_ID, &tab[i].imie, &tab[i].nazwisko, &tab[i].punkty);
	  printf("%d %s %s %d\n", tab[i].nr_ID, tab[i].imie, tab[i].nazwisko, tab[i].punkty);
 }
 }
	printf("Zawartosc tab\n");
    for(i=0;i<n;i++){
	 printf("%d %s %s %d\n", tab[i].nr_ID, tab[i].imie, tab[i].nazwisko, tab[i].punkty);
	}
                fclose( stream );
               free(tab);
        return 0;
}

Jakieś sugestie?

0
  1. sprawdzasz, czy plik jest otwarty, ale nie zależnie, czy jest, czy nie i tak go używasz...
  2. po co 2 raz deklarujesz zmienną i (w jednej pętli for)
  3. tak punkty powinieneś wczytywać jako %f
0

Dobra, z innej beczki :D Muszę dodać funkcję, która pobiera od użytkownika nr ID studenta i usuwa go z nowo utworzonej tablicy dynamicznej o rozmiarze o 1 mniejszym od tej w int mainie. Zrobiłem coś takiego:

 
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void funkcja(int n,int i, struct student *p){
	struct student *tab1;
	int id;
	printf("n=%d",n);
	tab1=( struct student *) malloc ((n-1)* sizeof(struct student));

	printf("Podaj ID ktore ma byc usuniete:\n");
	scanf("%d", &id);

	for(int j=0, i=0;i<n;i++){
		if(id == p[i].nr_ID){
			continue;
		}else{
			tab1[j]=p[i];
			j++;
		}
	}
	for(i=0;i<n-1;i++){
		printf("%d %s %s %d\n", tab1[i].nr_ID, tab1[i].imie, tab1[i].nazwisko, tab1[i].punkty);
	}
	free(tab1);
	
};

int wiersze(FILE *plik){
 
        int wiersz=0;
        char znak;
 
        while((znak = getc(plik)) != EOF) {
                if(znak == '\n')
                        ++wiersz;
        }  
   return wiersz;
}
 
struct student{
        int nr_ID;
        char nazwisko[20];
        char imie[20];
        double punkty;
};
int main(){
 
       
        struct student *tab;
        char plik[10];
        int i=0,n=0;
                FILE *stream;
 

        printf("Podaj nazwe pliku, ktory chcesz otworzyc:\n");
        scanf("%s",plik);
        strcat(plik, ".txt");
 
stream=fopen(plik,"r");
 
 
if(stream==NULL){
        printf("Blad przy otwieraniu pliku. Koniec programu\n");
		return 1;
}else{
        printf("Wczytano plik\n");
}
n = wiersze(stream);
printf("n=%d", n);
n=n+1;
rewind(stream);

tab = (struct student *)malloc(n*sizeof(struct student));
 if (fgetc(stream) == EOF)
		{
			printf("\nPlik jest pusty!\nKoniec programu\n");
			fclose(stream);
			system("pause");
			return 0;
		}
		else
		{
			rewind(stream); //jesli plik nie jest pusty, przewijamy kursor na poczatek pliku
		}
 printf("\n\nZawartosc %s:\n\n", plik);
	
 
 while (!feof(stream)) {
	 for(i=0;i<n;i++){
	 fscanf( stream,"%d%s%s%d", &tab[i].nr_ID, &tab[i].imie, &tab[i].nazwisko, &tab[i].punkty);
	  printf("%d %s %s %d\n", tab[i].nr_ID, tab[i].imie, tab[i].nazwisko, tab[i].punkty);
 }
 }
	printf("Zawartosc tab\n");
    for(i=0;i<n;i++){
	 printf("%d %s %s %d\n", tab[i].nr_ID, tab[i].imie, tab[i].nazwisko, tab[i].punkty);
	}
	funkcja(n,i,tab);
                fclose( stream );
               free(tab);
        return 0;
}

   

Wysypało się dużo błędów. Dołączam http://www10.zippyshare.com/v/G6RujaMM/file.html

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