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

Problem z wykrywaniem znaku końca linii ('\n') w pliku

Ostatnio zmodyfikowano 2010-08-16 12:57
Autor Wiadomość
ricardo83
Temat założony przez niniejszego użytkownika
Problem z wykrywaniem znaku końca linii ('\n') w pliku
» 2010-08-14 23:43:03
Witam

Zadaje kolejne pytanie gdyz glowie sie nad tym dobre kilka dni i nie potrafie sobie z tym poradzic :(.
A mianowicie chce zaczytac sobie do tablicy (na razie niech to bedzie tablica typu char) cyfry z pliku. Co to sa za liczby narazie nie ma wiekszego znaczenia (przynajmniej tak mi sie wydaje).
Pierwszy plik, ktory chcialbym sobie zaladowac ma okolo 700 kB i pokazuje poprawnie znaki konca wiersza(10,126,254 itd...) \\n. Pozniej stworzylem sobie drugi plik, ktory sklada sie z poczatku (powiedzmy 10 pierwszych linijek) tego pierwszego pliku (po prostu zrobilem kopiuj-wklej) i okazuje sie ze znak konca wiersza znajduje sie w innych pozycjach(15,131,260 itd...) a wg mnie znaki w obydwu przypadkach powinny byc na tych samych pozycjach :(
Prezentuje kod ktorego uzywam do ladowania danych:
C/C++
#include <iostream>
#include <cstdlib>
#include <fstream>

using namespace std;

int main()
{
   
    //troche duza tablica ale chodzi o sam fakt
    char bufor[ 13000 ];
    int i = 0, w = 0, arona;
    int koniecznaku = 0;
    int pozycja[ 10 ];
   
    fstream plik;
   
    //zmienna ktora bedzie okreslac polozenie wskaznika ladujacego znaki
    streampos tellg();
   
    plik.open( "satimage.txt", ios::in );
   
    if( plik.good() )
    {
        cout << "Udalo sie zaladowac plik :)\n";
        while( i < 13000 )
        {
            //pobierz znak   
            bufor[ i ] = plik.get();
            //jezeli znak jest koncem wiersza
            if( bufor[ i ] == '\n' )
            {
                //to wydrukuj gdzie on jest 
                cout << "Koniec znaku:" << plik.tellg() << endl;
                //zwieksz zmienna sumuje ilosc koncow znakow
                koniecznaku++;
               
            }
           
            i++;
        }
        cout << "Znakow konca znaku mamy:" << koniecznaku << endl;
       
       
    }
    else
    {
        cout << "ERROR\n";
    }
   
   
    return 0;
}

Moze ktos wie gdzie tkwi problem

jak cos moge wrzucic te pliki na jakis serwer bo samo wkopiowanie tutaj zawartoci moze nic nie dac:(

Pozdrawiam
P-20836
DejaVu
» 2010-08-15 03:22:34
W jednym pliku koniec wiersza oznaczony masz jako \r\n, a w drugim \n. To może być jakiś sensowny powód. Niemniej jednak nie za bardzo rozumiem co chcesz zrobić, jak jest zaformatowany plik z danymi itd., a w związku z tym zapewne niewiele osób będzie w stanie Ci udzielić jakiejkolwiek odpowiedzi.
P-20840
ricardo83
Temat założony przez niniejszego użytkownika
» 2010-08-15 08:31:50
hmm jak mozesz to sprobuj wkleic te zawartosc do pliku tekstowego:
7 36 6435
3 78 92 101 80 78 92 97 76 78 92 101 76 80 98 98 76 80 94 98 76 80 94 102 79 84 99 108 81 84 99 108 81 80 95 100 81
3 88 111 115 87 88 111 115 87 88 111 115 87 88 112 118 88 88 107 113 85 88 107 113 88 93 111 118 92 88 111 118 92 88 107 113 92
5 52 49 56 33 52 49 66 44 52 56 69 55 52 51 62 42 49 48 68 49 49 54 68 53 50 46 63 44 50 49 67 51 50 53 74 58
5 57 60 74 58 57 53 67 51 57 56 70 48 57 55 78 65 57 55 67 54 53 49 64 50 56 54 79 63 56 54 79 63 56 51 67 52
7 68 73 82 65 72 77 82 68 76 81 90 76 71 79 87 70 71 79 87 70 71 83 87 70 75 83 89 71 71 79 85 67 71 75 85 67
3 80 94 98 76 80 102 102 79 76 102 102 79 76 99 104 81 76 99 108 85 76 103 118 88 84 103 104 79 79 107 109 87 79 107 109 87
funkcja tellg przynajmniej u mnie mowi ze pierwszy znak konca znaku znajduje sie na 15 pozycji a wg mnie powinnien byc na 10 pozycji.
Moze te informacje bardziej podswietla obraz problemu.

a czy uzywany edytor tekstowy do ktorego zostala wklejana zawartosc moze jakos inaczej formatowac znaki?
pytam gdyz blad pojawia sie jak wklejam zawartosc do Notepad2, kompilatorze Code::Blocks 10.05 na Windowsie XP i mam taki oto wydruk na konsoli Udalo sie zaladowac plik :)
Koniec znaku:15
Koniec znaku:131.
Natomiast wkleilem zawartosc do edytora gedit, kompilatorze Code::Blocks 8.02 na Ubuntu 10.04 i pokazuje poprawnie koniec znaku
Udalo sie zaladowac plik :)
Koniec znaku:10
Koniec znaku:126.
Bardzo to dziwne.

Pozdrawiam i dziekuje za zainteresowanie tematem
P-20841
VND
» 2010-08-15 14:41:11
Otwórz plik w jakimś hexedytorze to zobaczysz jak masz zapisany znak końca linii.
Na Win (notatnik) to zwykle \r\n (0x0D 0x0A) czyli dwa znaki.
tellg je liczy dlatego odejmij 2 i masz pozycję.
Poza tym otwórz plik w trybie binarnym ios::binary
P-20851
ricardo83
Temat założony przez niniejszego użytkownika
» 2010-08-16 12:57:39
dziala prawidlowo z tym wlasnie zapisem
ios::binary.

dziekuje za pomoc i pozdrawiam
P-20869
« 1 »
  Strona 1 z 1