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

Błąd przy otwieraniu dużej ilości plików

Ostatnio zmodyfikowano 2014-04-22 14:09
Autor Wiadomość
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ę.
C/C++
for( int f = 0; f <= 752; f++ )
{
   
    char walor[ 20 ];
   
    //j=0;
    string lok = spolka;
    j = spolka.length();
    for( g = 0; g <= j; g++ )
   
    {
       
        walor[ google ] =( char ) lok[ g ];
    }
    //cout<<walor<<endl;
   
    int c = 0;
    c = licznik( walor );
    //cout<<c<<endl;
    string wiersz;
    ifstream plik;
    plik.open( lok.c_str(), ios::in );
   
    if( plik.good() )
    {
        //cout<<"POPRAWNIE UTWARTO PLIK 'WALOR'"<<endl;
    } else
    {
        cout << "ERROR.PLIK 'WALOR' NIE ZOSTAL OTWARTY" << endl;
    }
   
    int k = 0, m = 0;
    while( getline( plik, wiersz ) )
    {
       
        m++;
        if( m >= c - 149 )
        {
            //cout<<wiersz<<endl;
            //cout<<k<<endl;
            replace( wiersz.begin(), wiersz.end(), ',', ' ' );
            tabl[ k ] = wiersz;
            k++;
        }
       
       
       
    }
    plik.close();
P-108410
OczkoSX
» 2014-04-20 08:41:47
Zepsułeś ze znacznikami. Popraw je... Kod w ["cpp"]["/cpp"] bez cudzysłowia
P-108412
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.
P-108424
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.
P-108482
maly
» 2014-04-22 08:35:30
string lok = spolka;
Zawsze to samo.

C/C++
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.
P-108491
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:

C/C++
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 ];
    }
   
    //cout<<walor<<endl;
   
   
    int c = 0;
    c = licznik( walor );
    //cout<<c<<endl;
   
   
    string wiersz;
    fstream plik;
    plik.open( walor, ios::in );
   
    if( plik.good() )
    {
        //cout<<"POPRAWNIE UTWARTO PLIK 'WALOR'"<<endl;
    } else
    {
        cout << "ERROR.PLIK 'WALOR' NIE ZOSTAL OTWARTY" << endl;
    }
   
   
   
    int k = 0, m = 0;
    while( getline( plik, wiersz ) )
   
    {
        m++;
        if( m >= c - 149 )
        {
            //cout<<wiersz<<endl;
            //cout<<k<<endl;
            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.
P-108492
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.
P-108496
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.
P-108504
« 1 »
  Strona 1 z 1