Wypisywanie całej zawartości pliku(C)

0

Witam, mam problem z pewnym programem, który miałem sobie przećwiczyć do wtorkowego kolosa z infy. Kompletnie nie wiem jak się za to zabrać. Chodzi o przerobienie poniższego kodu tak, żeby zawsze wypisywał całą zawartość pliku. Myślałem tu o jakieś pętli ale chyba jednak to nie to. Bardzo proszę o pomoc, z góry wielkie dzięki a tu zamieszczam kod:

 int main() 
{ 
FILE *stream; 
char list[128]; 
int numread; 
 
//proba otwarcia pliku 
if( (stream = fopen( "r.txt", "r" )) != NULL ) 
{ 
  numread = fread( list, sizeof(char), 128, stream );  
printf( "Number of cir elements read = %d\n", numread ); 
printf("%s ",list);  
fclose( stream ); 
} else 
printf( "File r.txt could not be opened\n" ); 
 
return 0; 
 
} 
0

fread() służy do odczytu danych z pliku zapisanego binarnie.

http://www.cplusplus.com/reference/clibrary/cstdio/FILE/

0

Właśnie o coś takiego chodziło z tym feofem :) Wielkie dzięki za pomoc

0

Jednak chodzi o pętlę, taką aż plik nie będzie miał eofa

0

No właśnie. W sumie działa liczenie znaków ale co zrobić, żeby wypisywało mi w konsoli to co jest w pliku?

0

Skoro masz liczenie znaków, to znasz długość pliku w znakach i teraz robisz pętlę do EOF'a wczytując po kolei liczby do tablicy. Potem wyświetlasz lub w ogóle nie zapisujesz do tablicy tylko od razu na ekran.

0

Czy to ma być coś w tym stylu? Bo niestety wynikiem działania programu są jakieś dziwne krzaczki i nie wiem co z tym zrobić

 #include<stdio.h> 

int main() 
{ 
FILE *stream;
char list[128]; 
int numread, n=0, i; 
 
//proba otwarcia pliku 
if( (stream = fopen( "r.txt", "r" )) != NULL ) 
{ 
while (!feof(stream)) {
      fgetc (stream);
      n++;      
      }
	  for(i=0; i<=n; i++)
	  {
	  fread( list, sizeof(char), n, stream );
      printf("%s", list); 
	}    
fclose( stream ); 
printf( "Number of cir elements read = %d\n", n-1 ); 
} else 
printf( "File r.txt could not be opened\n" ); 
 
system("pause");
 
}

Wybaczcie za głupie pytania ale niestety na tych studiach musimy dosłownie wszystko próbować od podstaw sami kombinować bo nikt nam tego ani odrobinę nie tłumaczy :(

0
char* list;
(...)
// zaraz po zakończeniu pętli (while):
list = (char*)malloc(n);

// zamiast for:
fread(list, sizeof(char), n, stream);

Wywoływałeś fread w pętli, a powinieneś tylko raz, bo ona czyta z pliku tyle elementów ile wskażesz, a wskazałeś n, czyli za każdym razem czytałeś n elementów i wpychałeś je do tablicy, statycznej, a ma być wskaźnik jako argument fread.

0

Zrobiłem tak jak napisałeś ale podczas wypisywania tablicy wychodzą dalej te krzaczki :( Może dalej jest coś źle?

 #include<stdio.h> 

int main() 
{ 
FILE *stream;
char *list; 
int numread, n=0, i; 
 
//proba otwarcia pliku 
if( (stream = fopen( "r.txt", "r" )) != NULL ) 
{ 
while (!feof(stream)) {
      fgetc (stream);
      n++;      
      } 
      list = malloc(n);
      fread(list, sizeof(char), n, stream);
      printf ("%s", list);
      for (i=-1; i>=-10; i--)
	  {	  
	  fseek(stream, i, 2);   // dziesiąta pozycja od końca
    printf("%c\n", fgetc(stream));  
} 
fclose( stream ); 
printf( "Number of cir elements read = %d\n", n-1 ); 
} else 
printf( "File r.txt could not be opened\n" );  
system("pause"); 
}
0

Za dużo kombinujesz. Podałem Ci rozwiązanie w linku.

#include <cstdio>

int main(void)
{
	FILE* pFile;
	char arr[100];
	pFile = fopen("main.cpp", "r");
	if(!pFile)
		return 1;

	while(fgets(arr, 100, pFile) != NULL)
		puts(arr);

	getchar();
	return 0;
}

Lub drugi sposób z wykorzystaniem fgetc, prawdopodobnie tak jak chciałeś. Nie musisz rezerwować pamięci na tego stringa skoro masz to tylko wypisać na ekran

#include <cstdio>

int main(void)
{
	FILE* pFile;
	char c;
	pFile = fopen("main.cpp", "r");
	if(!pFile)
		return 1;

	while(fgetc(pFile)); /* to jest pętla którą Ty masz, przez to, że zliczałeś znaki to pozytor ustawił się na końcu pliku, nie dasz rady wczytać nic, bo jest na końcu, prawdopodobnie w twoim kodzie wystarczy tylko po pętli while ustawić to co ja mam linijkę niżej i może śmigać, choć nie przyglądałem się twojemu programowi*/

	fseek(pFile, 0, SEEK_SET); // ustawia pozytor na początku pliku

	while((c = fgetc(pFile)) != EOF)
		printf("%c", c);

	getchar();
	return 0;
}
0

Ja mam krótsze:

system("cat r.txt");

:D

0

Cat to instrukcja z Linuxa, na windowsie to nie idzie ;]

0

A to pech :D Niech więc piszą kolokwium pod Linuksem ;)

0

Rzeczywiście drugi sposób MJaya zadziałał :) Jeśli chodzi o pisanie kolokwium to będzie na linuksie więc ta instrukcja cat też może się przydać. Wielkie dzięki ;)

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