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

[C] Problem z odczytywaniem wielocyfrowych integerów z pliku .txt.

Ostatnio zmodyfikowano 2016-12-21 11:01
Autor Wiadomość
Master_Exploder
Temat założony przez niniejszego użytkownika
[C] Problem z odczytywaniem wielocyfrowych integerów z pliku .txt.
» 2016-12-18 21:12:37
Mam plik .txt z napisanymi cyframi: 1 1 1 1 12 1 1 1 1. Chciałbym je wyświetlić i wykonywać później dalsze operacje, ale zaciąłem się w miejscu poniższego fragmentu kodu (printf napisałem dla sprawdzenia co jest odczytywane).
C/C++
int cyfra;
FILE * plik;

plik = fopen( "maski.txt", "r" );

l_linii = 0;
while( l_linii < N - 1 )
{
    fscanf( plik, "%d", & cyfra ); //pobranie znaku
    printf( "%d", cyfra );
    if( cyfra == '\n' || cyfra == feof( "maski.txt" ) ) l_linii++;
   
}
no i na wyjściu mam 49 49 49 49 49 50 49 49 49 49. Zapisuje mi te jedynki jako wartości ASCII i ponadto dwunastka jest rozdzielona na 1 i 2. Jak to naprawić, żeby zapisywało mi 1 z txt jako int 1, a 12 jako int 12?

(piszę program do przetwarzania obrazów, to tylko fragment kodu, który mi nie działa, dotyczy wczytywania maski).
P-155156
Szustarol
» 2016-12-18 21:27:04
zmień typ zmiennej na wchar albo castuj, poza tym z tego co pamiętam (długo w C zwykłym nie pisałem), zamiast %d możesz użyć %c i wtedy będzie wypis jako char.
P-155157
mateczek
» 2016-12-18 21:32:31
ten "if" jest bez sensu !!! jak czytasz inty to nie znaki.A jak znaki to nie linie
C/C++
#include <stdio.h>

int main() {
    int cyfra;
    FILE * plik;
   
    plik = fopen( "maski.txt", "r" );
   
   
    while( !feof( plik ) )
    {
        fscanf( plik, "%d", & cyfra ); //pobranie liczby
        printf( "%d ", cyfra );
    }
}
P-155159
Master_Exploder
Temat założony przez niniejszego użytkownika
» 2016-12-18 22:11:04
W sumie to źle to opisałem:
C/C++
struct tablicamaski
{
    int rozmiar_tablicy;
    float * tablica;
};
struct tablicamaski * CzytajMaske( int N ) //int N to numer linii
{
    struct tablicamaski * wsk;
    wsk =( struct tablicamaski * ) malloc( sizeof( struct tablicamaski ) );
    int l_linii, dlugosc;
    char znak;
    int i;
    FILE * plik;
    fpos_t pos;
    plik = fopen( "maski.txt", "r" );
    l_linii = 0;
    while( l_linii < N - 1 ) //to while przesuwa kursor do żądanej linii
    {
        znak = fgetc( plik ); //pobranie znaku
        printf( "%c", znak );
        if( znak == '\n' ) l_linii++;
       
    }
    //printf("jestem po %d linii\n", l_linii);
    fgetpos( plik, & pos ); //save z pozycji
    //printf("Aktualna pozycja w pliku: %d\n", pos);
    dlugosc = 0;
    do
    {
        znak = fgetc( plik ); //pobranie znaku
        //printf("Pobralem %c\n", znak);
        if( znak != ' ' && znak != ',' && znak != '\n' )
        {
            //printf("%c ", znak);
            dlugosc++;
        }
    } while( znak != '\n' );
   
    wsk->rozmiar_tablicy = dlugosc;
    printf( "dlugosc :%d\n", dlugosc );
    wsk->tablica =( float * ) malloc( wsk->rozmiar_tablicy * sizeof( float ) );
    fsetpos( plik, & pos ); //przewija kursor do początku linii
    //printf("Aktualna pozycja w pliku: %d\n", pos);
    for( i = 0; i < wsk->rozmiar_tablicy; i++ )
    {
        fscanf( plik, "%f,", & wsk->tablica[ i ] );
        printf( "%f ", wsk->tablica[ i ] );
    }
    return wsk;
}
maski.txt:
1 1 1 1 1 1 1 1 1
1 1 1 1 2 1 1 1 1
1 1 1 1 4 1 1 1 1
1 1 1 1 12 1 1 1 1
(maski mogły mieć jeszcze długości 16;25 itd, więc pisałem tę funkcję uniwersalnie na przyszłość)
Pierwotnie to wyglądało tak jak powyżej, pierwsze 3 wiersze działały, ale potem ogarnąłem, że nie zadziała w czwartym, bo jest 12, (albo jak dopiszę linijkę gdzie wartości będą miały minusy) bo pobiera tylko 1 char, próbowałem zmienić typ zmiennej (co było głupie - teraz już wiem) i teraz nie wiem czy jest to jeszcze do uratowania, czy trzeba by od nowa napisać inaczej?
P-155167
mateczek
» 2016-12-19 20:24:06
na wzór stringStrem z c++
1 czytaj getline całą linie do bufora
2 bufor ładuj do strumienia
3 wyciągaj liczby ze strumienia


przykład w C
C/C++
#include <stdio.h>

int main() {
    int cyfra;
    FILE * plik, * stream;
    char * buffer; int bufferSize;
   
    plik = fopen( "dane.txt", "r" );
    while( getline( & buffer, & bufferSize, plik ) != - 1 ) // linijka z pliku
    {
        stream = fmemopen( buffer, bufferSize, "r" ); // linia do strumienia
        int cyfra;
        while( fscanf( stream, "%d", & cyfra ) ) { // wyciąganie ze strumienia liczbę
            printf( "%d ", cyfra );
        }
        fclose( stream );
    }
}

przykład W c++:
C/C++
#include<iostream>
#include<fstream>
#include<sstream>
using namespace std;
int main()
{
    string liniaTekstu;
    fstream plik( "dane.txt" );
    while( getline( plik, liniaTekstu ) ) {
        stringstream ss;
        ss << liniaTekstu;
        int liczba;
        while( ss >> liczba ) {
            cout << liczba << " ";
        }
    }
   
}
P-155197
mokrowski
» 2016-12-19 22:25:04
Linie czytaj getline(...) oraz zapoznaj się z wywołaniem strtok(...) (dość nietuzinkowo pracuje) oraz konwersją z tekstu na float.
P-155204
mateczek
» 2016-12-21 08:59:38
PS. Przykład w "C" jak go składałem na Linux mi się skompilował i działał. Ale próba kompilacji na Windows(mingw) sypie błędami:
"undefined refernece to getline" Brak jakieś biblioteki do "C" biblioteki zawierającej funkcje getline(), która widać nie występuje w mingw a jest pod linux :(. Więc proste użycie "getline()" do przeczytania wiersza w "C". Może okazać się pod windows trochę kłopotliwe
P-155231
mokrowski
» 2016-12-21 11:01:53
W MSYS a dokładniej w pakiecie textutils jest getline() także dla MS Windows.
P-155232
« 1 »
  Strona 1 z 1