Sortowanie pliku - łączenie proste
Ostatnio zmodyfikowano 2017-12-07 08:51
MariuszM Temat założony przez niniejszego użytkownika |
Sortowanie pliku - łączenie proste » 2017-12-07 07:10:05
void Split( int partLength ) { DATA_TYPE buffer; int counter; do { counter = 1; while(( counter <= partLength ) &&( !feof( inFile ) ) { read( inFile, & buffer ); write( auxFileOne, buffer ); counter = counter + 1; } counter = 1; while(( counter <= partLength ) &&( !feof( inFile ) ) { read( inFile, & buffer ); write( auxFileTwo, buffer ); counter = counter + 1; } } while( !feof( inFile ) ); }
void Combine( int partLength ) { DATA_TYPE bufferOne; DATA_TYPE bufferTwo; int counterOne; int counterTwo; if( feof( auxFileOne ) == false ) read( auxFileOne, & bufferOne ); if( feof( auxFileTwo ) == false ) read( auxFileTwo, & bufferTwo ); while(( feof( auxFileOne ) == false ) &&( feof( auxFileTwo ) == false ) ) { counterOne = 1; counterTwo = 1; do { if( bufferOne < bufferTwo ) { Write( inputFile, bufferOne ); if( feof( auxFileOne ) == false ) read( auxFileOne, & bufferOne ); counterOne = counterOne + 1; } else { write( inputFile, bufferTwo ); if( feof( auxFileTwo ) == false ) read( auxFileTwo, & bufferTwo ); counterTwo = counterTwo + 1; } } while( ( counterOne <= partLength ) && ( counterTwo <= partLength ) && ( feof( auxFileOne ) == false ) && ( feof( auxFileTwo ) == false ) ); while(( counterOne <= partLength ) &&( feof( auxFileOne ) == false ) ) { read( auxFileOne, & bufferOne ); write( inputFile, bufferOne ); counterOne = counterOne + 1; } while(( counterTwo <= partLength ) &&( feof( auxFileTwo ) == false ) ) { read( auxFileTwo, & bufferTwo ); write( inputFile, bufferTwo ); counterTwo = counterTwo + 1; } } while( feof( auxFileOne ) == false ) { read( auxFileOne, & bufferOne ); write( inputFile, bufferOne ); } while( feof( auxFileTwo ) == false ) { read( auxFileTwo, & bufferTwo ); write( inputFile, bufferTwo ); } }
int main( void ) { int partLength = 1; bool exitCond = false; do { inputFile = fopen( inputFileName, ” r ” ); auxFileOne = fopen( auxFileNameOne, ” w ” ); auxFileTwo = fopen( auxFileNameTwo, ” w ” ); Split( partLength ); fclose( auxFileOne ); fclose( auxFileTwo ); fclose( inputFile ); inputFile = fopen( inputFileName, ” w ” ); auxFileOne = fopen( auxFileNameOne, ” r ” ); auxFileTwo = fopen( auxFileNameTwo, ” r ” ); if( !feof( auxFileTwo ) ) { Combine( partLenght ); partLength = 2 * partLength; } else exitCond = true; fclose( auxFileTwo ); fclose( auxFileOne ); fclose( inputFile ); while( exitCond == false ); } }
Gdy przepisałem ten kod na Pascala (Operacje na łańcuchach Pascalowych są wygodniejsze niż na tablicach znakowych z C) to okazało się że ten kod nie dość że nie kopiuje całego pliku to i nie sortuje poprawnie nawet tego co przekopiował Nie wiem gdzie jest błąd i jak go poprawić |
|
darko202 |
» 2017-12-07 08:08:06 >> okazało się że ten kod nie dość że nie kopiuje całego pliku używasz warunku np. " while(( counter <= partLength ) &&( !feof( inFile ) ) " nie zależącego tylko od napotkania końca pliku ? dlatego nie jest to dziwne
>> nie sortuje poprawnie nawet tego co przekopiował w kodzie nie widać algorytmu sortującego coś, dlatego nie jest to dziwne
2. zapoznaj się z techniką debugowania kodu, dzięki czemu możesz obejrzeć stany zmiennych, przebieg całego programu i bardzo szybko zobaczyć wady tworzonego algorytmu
|
|
MariuszM Temat założony przez niniejszego użytkownika |
» 2017-12-07 08:22:14 To chyba jednak nie to bo ta pętla którą wymieniłeś jest wewnątrz pętli do while
Co do debugowania to wątpię aby to miało jakoś pomóc ale gdybyście coś o tym napisali np w tych waszych kursach to bym poczytał
|
|
YooSy |
» 2017-12-07 08:51:02 Co do debugowania to wątpię aby to miało jakoś pomóc ale gdybyście coś o tym napisali np w tych waszych kursach to bym poczytał | Debugging with Code::BlocksDebugger jest pierwszą linią poszukiwań błędów logicznych, crashy itd. Wszystko co dotyczy C::B jest na stronie producenta. W serwisie YouTube jest cała masa tutoriali o debuggowaniu kodu. np. chałupnicze sposoby. |
|
« 1 » |