Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Wczytywanie danych z pliku

Ostatnio zmodyfikowano 2012-11-02 16:52
Autor Wiadomość
Kmicic
Temat założony przez niniejszego użytkownika
[C++] Wczytywanie danych z pliku
» 2012-11-02 12:32:07
Czy jeśli chcę wczytać 6400 znaków z pliku, do tablicy 80x80, to czy ten kod na pewno działa poprawnie ?
C/C++
while(( c = getc( pFile ) ) != EOF )
{
    if( c == '\n' ) putchar( '\n' );
    else if( isdigit( c ) ) putchar( c );
   
    znak[ n ][ k ] = c;
    n++;
   
    if( n == 80 )
    {
        n = 0;
        k++;
    }
}
P-68171
crash
» 2012-11-02 12:55:50
Na pierwszy rzut oka, przydzieliłeś pamięć tablicy, którą chcesz wypełnić?
P-68177
Kmicic
Temat założony przez niniejszego użytkownika
» 2012-11-02 13:00:13
To znaczy to nie jest pełny kod:
C/C++
FILE * pFile;
int c, n = 0, k = 0;
char znak[ 90 ][ 90 ];

pFile = fopen( "maps\\myfile.txt", "r" );

while(( c = getc( pFile ) ) != EOF )
{
    if( c == '\n' ) putchar( '\n' );
    else if( isdigit( c ) ) putchar( c );
   
    znak[ n ][ k ] = c;
    n++;
   
    if( n == 80 )
    {
        n = 0;
        k++;
    }
   
    if( k == 80 )
    {
        break;
    }
}

Problem polega na tym że w konsoli pojawia mi się poprawnie wczytany bloczek + potem kolejny bloczek pełny śmieci.
P-68178
DejaVu
» 2012-11-02 13:23:15
Fix:
C/C++
if( c == '\n' )
{
    putchar( '\n' );
    continue;
} else if( isdigit( c ) ) putchar( c );

P-68181
Kmicic
Temat założony przez niniejszego użytkownika
» 2012-11-02 13:53:36
Trochę nie fajnie bo śmieci nadal występują:
C/C++
while(( c = getc( pFile ) ) != EOF )
{
   
    if( c == '\n' )
    {
        putchar( '\n' );
        continue;
    }
   
    else if( isdigit( c ) ) putchar( c );
   
    znak[ n ][ k ] = c;
    n++;
   
    if( n == 80 )
    {
        n = 0;
        k++;
    }
   
    if( k == 80 )
    {
        break;
    }
}
Jeśli to nie jest wina tego fragmentu to będę już miał jakiś trop, jak myślicie ?
P-68187
Admixior
» 2012-11-02 15:02:32
A czy tą tablice nie próbujesz później jakoś wypisać?
cout <<* znak;
 ///???
Bo wyświetlenie śmieci (o ile nie istnieją one w pliku textowym) jest nie możliwe. Gdyż wcześniej getc() zwróci EOF i pętla się przerwie.
Jeśli natomiast robisz w ten sposób lub podobny to  nie zapominaj dawać NULL w odpowiednim miejscu.

fread()//użycie tej funkcji pozwoli ci odczytać całość tekstu.

PS. Dlaczego '\n' nie zapisujesz do tablicy (Czy to nie chodziło o to by wpakować 80 linijek do 80 tablic char?)
P-68204
crash
» 2012-11-02 15:09:43
C/C++
char znak[ 90 ][ 90 ]; //8100 elementow wyswietla sie
...
if( n == 80 )
{
    n = 0;
    k++;
}

if( k == 80 )
{
    break; //a max wczytanysch 80x80... pozostale, niepoprawne, to smieci
}

Nie wypełniasz całej tablicy, a całą wyświetlasz (8100 znaków)
P-68206
Kmicic
Temat założony przez niniejszego użytkownika
» 2012-11-02 15:20:37
mam plik wyglądający w ten sposób

234567890
456789033
545678909 itd.

chciałem zrobić coś takiego by po napotkaniu entera do tablicy nie był on przypisywany. Pozwala mi to właśnie na takie rozmieszczenie pliku,a nie w jednym ciągu.

Crash, zapomniałem o tym elemencie, powiększyłem tablicę odrobinę, bo było jakieś przeciążenie. Przy wczytywaniu teraz spiker piknie raz, po czym konsola wypluwa zawartość tablicy + te śmieci z reszty. Po zmianie tablicy na 79x79 wyskakuje ERROR, tablica przeładowana. Zaś po ustawieniu 80x80 śmieci na końcu.
P-68209
« 1 » 2
  Strona 1 z 2 Następna strona