Wczytanie pliku w c++


(Ewageo) #1

Pisze program w visualu i wyswietlam w win32 application console:

int _tmain(int argc, _TCHAR* argv[])

{

	char wiersz[dl_wiersza];

	FILE*plik=fopen("C:\\dane.txt","r");

	while(fgets(wiersz, dl_wiersza, plik)!=NULL)

	{

		printf("%s",wiersz);

	}

	fclose(plik);


}

Niestety zamiast 5000 liczb wyswietla mi tylko ok 400. Gdy umieszczam licznik w pętli to pokazuje 5000, więc albo przepełnia sie pamięć :wink: albo application console nie może wyświetlic tylu wierszy. Jak to naprawić?


(Sawyer47) #2

To na 99% kwestia pojemności historii emulatora terminala. To już jest raczej do zmiany w ustawieniach emulatora.


(Ewageo) #3

A gdzie dokładnie mozna to zmienić?

EDIT: Już rozwiązałem - do zamknięcia.


(Sawyer47) #4

No to już sprawa użytkownika i tego jakiego używa terminala/konsoli czy jak to jeszcze nazwać. Ja sam mam ustawione na 900 wierszy w gnome-terminal. Wypisz sobie w pętli liczby od 1 do 1000 - też ileś pierwszych nie zostanie zapamiętanych. No bo po co wyświetlać użytkownikowi na raz więcej niż kilkadziesiąt linii tekstu? Zawsze możesz zapakować te linijki do tablicy i napisać funkcyjkę wypisującą linijki od-do, jeżeli już potrzeba operować na tak dużej ilości tekstu.


(Ewageo) #5

Ok Mam teraz napisać program: wczytać 1000 liczb z pliku do tabeli, policzyc sume:

include "stdafx.h"

include

define dl_wiersza 256

int _tmain(int argc, _TCHAR* argv[])

{

int i=0;

int j=0;

int suma=0;

int *wsk1;

char wiersz[dl_wiersza];

FILE*plik=fopen("c:\dane.txt","r");

while(fgets(wiersz, dl_wiersza, plik)!=NULL)

i++;

fclose(plik);

fopen("c:\dane.txt","r");

wsk1 = new int_;_

while(fscanf(plik, "%d", wsk1)!=EOF)

{

suma+=*wsk1;

}

while(j<=i)

{

printf("%d\n",*wsk1);

wsk1++;

j++;

}

printf("Suma wynosi=%d\n",suma);

fclose(plik);

}

Przy wypisywaniu pokazuje mi tylko pierwsza komórke a tablicy, a z pozostałych 999 zwraca śmieci, dlaczego?


(Sawyer47) #6

Pewnie wsk1 pokazuje na koniec tablicy. (przynajmniej na to wygląda). Nie powinno się w ogóle zmieniać adresu wskaźnika który wskazuje na dynamicznie rezerwowany obszar pamięci. Lepiej zrobić go wskaźnikiem stałym, a drugiego wskaźnika używać do iterowania po tablicy.


(Ewageo) #7

Wskażnikiem wsk1 nie iteruje już, ale nadal cos jest nie tak - zwraca śmieci:

include "stdafx.h"

include "stdlib.h"

define dl_wiersza 256

int _tmain(int argc, _TCHAR* argv[])

{

int i=0;

int j=0;

int suma=0;

int *wsk2;

char wiersz[dl_wiersza];

FILE*plik=fopen("c:\dane.txt","r");

while(fgets(wiersz, dl_wiersza, plik)!=NULL)

i++;

fclose(plik);

fopen("c:\dane.txt","r");

int* const wsk1= new int_;_

wsk2=wsk1;

while(j<=i)

{

printf("%d\n",*wsk2);

wsk2++;

j++;

}

fclose(plik);

}


(Monczkin) #8

juveziom0 , proszę kody objąć znacznikami code - od tego są :slight_smile: