Foton83 Temat założony przez niniejszego użytkownika |
Błąd przy otwieraniu dużej ilości plików » 2014-04-20 07:10:11 Witam Wszystkich, zdecydowałem się zarejestrować na tym portalu ponieważ mój problem przerósł mnie. Od razu zaznaczę, że odpowiedzi szukałem wszędzie, nawet na stronach anglojęzycznych i jej nie znalazłem. Mój problem polega na tym, że utworzyłem kod programu który robi różne operacje na wielu plikach .txt oraz .mst ale odkryłem błąd przy otwieraniu plików o takiej samej ilości liter w nazwie i mających ten sam początek składający się z 4 liter. Wyjaśnię to na przykładzie: Mamy trzy pliki o nazwie XXXXabcd.mst XXXXefgh.mst XXXXijkl.mst. Pliki te znajdują się jeden po drugim, jeżeli chodzi o nazwy. Mój program otwiera plik XXXXabcd.mst z czytuje dane z niego, zamyka go. Oczywiście wszystko to odbywa się w pętli for. Następny obrót pętli, program otwiera plik XXXXefgh.mst ale już wczytuje dane z pliku XXXXabcd.mst. Następny obrót pętli, program otwiera plik XXXXijkl.mst ale znowu wczytuje dane z pliku XXXXabcd.mst. Zaznaczę, że mój program otwiera ponad tysiąc plików i radzi sobie bardzo dobrze, ale w momencie opisanym powyżej dzieją się cuda. Mam podejrzenia,że funkcja open() idzie na skróty i sprawdza pierwsze cztery litery pliku oraz ogólną liczbę w nazwie pliku, stąd ten błąd. Poniżej wkleję kod za pomocą którego odbywają się te cuda:). Jeżeli ktoś miał podobny problem i wie jak go rozwiązać to proszę o pomoc albo wskazówki. Z góry dziękuję. for( int f = 0; f <= 752; f++ ) { char walor[ 20 ]; string lok = spolka; j = spolka.length(); for( g = 0; g <= j; g++ ) { walor[ google ] =( char ) lok[ g ]; } int c = 0; c = licznik( walor ); string wiersz; ifstream plik; plik.open( lok.c_str(), ios::in ); if( plik.good() ) { } else { cout << "ERROR.PLIK 'WALOR' NIE ZOSTAL OTWARTY" << endl; } int k = 0, m = 0; while( getline( plik, wiersz ) ) { m++; if( m >= c - 149 ) { replace( wiersz.begin(), wiersz.end(), ',', ' ' ); tabl[ k ] = wiersz; k++; } } plik.close();
|
|
OczkoSX |
» 2014-04-20 08:41:47 Zepsułeś ze znacznikami. Popraw je... Kod w ["cpp"]["/cpp"] bez cudzysłowia |
|
MrPoxipol |
» 2014-04-20 14:00:42 Mam podejrzenia,że funkcja open() idzie na skróty i sprawdza pierwsze cztery litery pliku oraz ogólną liczbę w nazwie pliku, stąd ten błąd. |
Nie. Błąd na pewno jest w kodzie. |
|
Foton83 Temat założony przez niniejszego użytkownika |
Błąd przy otwieraniu dużej ilości plików » 2014-04-21 19:17:56 do Mrpoxipol.
Sprawdziłem kod i jak na moje oko nie znalazłem błędu. Zresztą przy otwieraniu plików ciężko popełnić błędy. Zresztą kod przedstawiłem poniżej wiadomości. Więc jak jest błąd to proszę o wskazówki albo o pomoc bo moja wiedza na ten temat jest za mała, a próba jej uzupełnienia skończyła się fiaskiem. |
|
maly |
» 2014-04-22 08:35:30 string lok = spolka; Zawsze to samo. for( g = 0; g <= j; g++ ) { walor[ google ] =( char ) lok[ g ]; } Dlaczego <= , co to google i po co powielasz dane? Wczytuj linie tylko wtedy kiedy plik został poprawnie otwarty bo teraz to jest trochę dziwne. |
|
Foton83 Temat założony przez niniejszego użytkownika |
» 2014-04-22 08:49:22 Nie wierzę. Jakieś dziwne rzeczy się tu dzieją. Wczoraj ten kod był poprawny, nic nie edytowałem!!! Oczywiście było tak: for( int f = 0; f <= 752; f++ ) { char walor[ 20 ]; j = 0; string lok = spolka[ f ]; j = spolka[ f ].length(); for( g = 0; g <= j; g++ ) { walor[ g ] =( char ) lok[ g ]; } int c = 0; c = licznik( walor ); string wiersz; fstream plik; plik.open( walor, ios::in ); if( plik.good() ) { } else { cout << "ERROR.PLIK 'WALOR' NIE ZOSTAL OTWARTY" << endl; } int k = 0, m = 0; while( getline( plik, wiersz ) ) { m++; if( m >= c - 149 ) { replace( wiersz.begin(), wiersz.end(), ',', ' ' ); tabl[ k ] = wiersz; k++; } } plik.close();
edit/ Jeszcze raz proszę pomoc. Przejrzałem cały kod i nigdzie nie znalazłem błędu. |
|
maly |
» 2014-04-22 10:25:19 Jeśli podajesz nazwę do istniejącego pliku to musi się otworzyć. Błędu szukałbym raczej w parsowaniu plików, złym zapamiętywaniu otrzymanych danych lub błednej interpretacji wyników. Nie powielaj danych a tym bardziej nie przepisuj ich z jednego typu do innego(string do char), zmienne deklaruj tam gdzie są potrzebne a nie kilometr wcześniej. |
|
Foton83 Temat założony przez niniejszego użytkownika |
» 2014-04-22 14:09:37 Zawziąłem się i znalazłem. Niestety koledzy/koleżanki mieliście rację:). Błąd był w kodzie. Dokładnie licząc zmienną c, niektóre spółki nie miały wystarczającej ilości wierszy a to powodowało, że dane ostatnie były z czytywane poprzedniego pliku( po prostu nie były nadpisywane z bieżącego pliku). Także dziękuję wszystkim, którzy odczytali mój post i starali się mi pomóc. |
|
« 1 » |