Napisz funkcje do obliczania rozmiaru plików, jako argument, powinna przyjąć ścieżkę do pliku

0

Mam zadanie do zrobienia, całość polecenia brzmi :

Napisz funkcje do obliczania rozmiaru plików, jedna, jako argument, powinna przyjąć ścieżkę do pliku, a druga wskaźnik do pliku. Prototypy funkcji powinny wyglądać następująco:

int file_size_from_path(const char *path);
int file_size_from_file(FILE *f);

Funkcje powinny zwrócić rozmiar pliku lub -1 w przypadku, kiedy niemożliwe jest jego określenie. Funkcja file_size_from_file nie może modyfikować wskaźnika do pliku. Napisz program, który pobierze od użytkownika ścieżkę do pliku, a następnie wykorzystując przygotowane wcześniej funkcje obliczy jego rozmiar. Program powinien wyświetlić rozmiar pliku, jeżeli obie metody zwróciły ten sam wynik i zakończyć działanie z kodem błędu 0. Jeżeli nie uda się otworzyć pliku program powinien wyświetlić komunikat “Error” i zakończyć działanie z kodem błędu 1. Pamiętaj o tym, żeby zamknąć plik na koniec działania programu.

Przykładowe wejście:

Podaj sciezke do pliku:⏎
text.txt⏎

Przykładowe wyjście (dla pliku text.txt):

Rozmiar pliku wynosi 65 bajtów

Napisałem funkcję przyjmującą wskaźnik do pliku, jednak nie wiem jaka metoda wykorzystuje scieżkę pliku. Proszę o pomoc. Oto mój kod:

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

int file_size_from_path(const char *path){
	
	int i;
	int count = 0;
	for(;;){
		i = fgetc(path);
		if(i == EOF) break;
		count++;
	}
	return count;
}

int file_size_from_file(FILE *f){
	
	int i;
	int count = 0;
	for(;;){
		i=fgetc(f);
		if(i == EOF) break;
		count++;
	}
	return count;	
}

int main() {
	
	char path[30];
	char *p = path; 
	
	printf("Podaj nazwe pliku");
	scanf("%30s", path);
	
	FILE *fp;
	fp = fopen(path, "r");
	
	if(fp == NULL){
		printf("Error");
		exit(1);
	}
	
	//int count1 = file_size_from_path(p);
	int count2 = file_size_from_file(fp);
	printf("%d", count2);
	//if(count1 == count2){
	//	printf("Rozmiar pliku wynosi %d bajtów", count1);
	//}
	
	fclose(fp);
	return 0;
}
0

Raczej masz użyć fseek i ftell niż pobrać cały plik. Do otworzenia pliku użyj fopen.

0

Ale funkcja fseek nie przyjmuje nazwy pliku jako argument prawda ?

1

No nie przyjmuje. Za to fopen już tak.

0

Jak właściwie powinienem użyć fseek ? Czy to ma sens ?

int check;
for(i = 0; ; i++){
check = fseek(fp, 1, i);
if(check = EOF) break;
} 
return i;
1

Otwierasz plik. Szukasz końca (SEEK_END), używasz ftell do sprawdzenia odległości od początku, zamykasz plik. dokumentacja nie jest taka trudna do znalezienia i przeczytania.

0

Oto mój program po poprawkach. Został sprawdzony na pliku tekstowym o rozmiarze(jak twierdzi strona 2346 bajtów). Pierwsza funkcja zwróciła wartość 2345, a druga 2351. Gdy skopiowałem tekst ze strony do mojego pliku testowego we właściwościach napisane jest że ma on rozmiar 2351 więc sam już nie wiem.

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

int file_size_from_path(const char *path){
	
	if(path == NULL) return -1;
	
	FILE *text;
	text = fopen(path, "r");
	
	int count = 0;
	int i;
	while(i != EOF){
		i = fgetc(text);
		count++;
	}
	
	fclose(text);
	return count;
}

int file_size_from_file(FILE *f){
	
	int count = 0;
	int check;
	int i;
	for(i = 0; ; i++){
	fseek(f, i, 0);
	check = fgetc(f);
	if(check == EOF) break;
	}
	count = ftell(f);
	return count;
}

int main() {
	
	char path[30];
	char *p = path; 
	printf("Podaj nazwe pliku");
	scanf("%29s", path);
	
	FILE *fp;
	fp = fopen(path, "r");
	
	if(fp == NULL){
		printf("Error");
		exit(1);
		return 1;
	}
	
	int count1 = file_size_from_path(p);
	int count2 = file_size_from_file(fp);
	if(count1 == count2){
		printf("Rozmiar pliku wynosi %d bajtow", count1);
	}
	
	fclose(fp);
	return 0;
}
0

Użyj fseek

0

druga funkcja nie przechodzi testów jednostkowych przy pustym pliku

Sprawdzanie czy funkcja file_size_from_file nie przesunęła wskaźnika pliku⏎
Wywołanie: test_is_equal(pos, ftell(f)) == 1⏎
Wartość zwrócona: 0; oczekiwana: 1. Wynik: PORAŻKA⏎

0

Poprawka: użyj fseek celem znalezienia końca pliku (SEEK_END). No i pewnie powinieneś otwierać plik w trybie binarnym (rb)

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