starter Temat założony przez niniejszego użytkownika |
[C++] Standardowy strumień wejścia - znak końca pliku EOF » 2014-10-11 23:56:43 Temat może trochę wydawać się błędny, jednak cytuje tam to, co znalazłem w zadaniu. Mianowicie: "W oddzielnych wierszach standardowego wejścia zapisano wyrażenia lub nawiasy. Liczba znaków w jednym wierszu nie przekracza 250, a liczba wierszy nie przekracza 3 000. W ostatnim wierszu zapisano znak ko«ca pliku (EOF)." Moje pytanie brzmi: jak zakodować wykrycie tego znaku końca linii? Czy przy std::cin spowoduje to błąd wczytywania danych std::cin.good() ? Z góry dziękuję za wszelką pomoc :) |
|
colorgreen19 |
» 2014-10-12 12:43:34 W ostatnim wierszu zapisano znak ko«ca pliku (EOF)." |
jak zakodować wykrycie tego znaku końca linii? |
to końca lini czy końca pliku? Nie rozumiem zbytnio o co ci chodzi, może to cos pomoże: http://pl.wikipedia.org/wiki/Koniec_liniiJeżeli pracijesz na Windowsie koniec lini będzie jako CR (ascii 13) LF (ascii 10 ), więc możesz użyc prostego sprawdzania znaków np. ifstream file( nazwa_pliku.c_str(), ios::in | ios::binary );
char buff; while( !file.eof() ) { file.get( buff ); cout <<( int ) buff << " "; }
przy każdym końcy lini to wypisze ci 13 10 , natomiast na konieć pliku, jesli będziesz miał ostatnią linie pustą kończącą wypisze 13 10 10 |
|
starter Temat założony przez niniejszego użytkownika |
» 2014-10-12 12:51:04 sory z tym końcem linii to mój błąd. Zadaniu mowa o EOF mimo, że wczytuje ze strumienia tekstowego. |
|
colorgreen19 |
» 2014-10-12 12:53:37 pokaz jak wyglądają 3 ostatnie linie tego pliku z którego wczytujesz oraz jeszcze raz, co masz zrobić i najlepiej twoj dotychczasowy kod |
|
starter Temat założony przez niniejszego użytkownika |
» 2014-10-12 13:01:30 https://drive.google.com/file/d/0B1KHzE4UnEMWTklsekg1djJrTWs/view?usp=sharingTo jest treść zadania. Wynika z niej jednoznacznie, że wczytywać mam ze standardowego strumienia. A oto mój dotychczasowy kod: #include <iostream>
int main() { std::string data[ 3000 ]; int r_count = 0; int o_count = 0; int c_count = 0; std::string answer[ 3000 ]; std::cin.clear(); std::cin.sync(); for( int i = 0; i < 3000; i++ ) { std::getline( std::cin, data[ i ] ); if( data[ i ] == '/n' || i == 2999 ) { r_count = i + 1; break; } } for( int i = 0; i < r_count; i++ ) { for( int j = 0; j < data[ i ].length(); j++ ) { if( data[ i ][ j ] == '(' ) o_count++; else if( data[ i ][ j ] == ')' ) c_count++; } if( o_count == c_count ) answer[ i ] = "TAK"; else answer[ i ] = "NIE"; o_count = 0; c_count = 0; } for( int i = 0; i < r_count; i++ ) std::cout << answer[ i ] << std::endl; return 0; }
Nie wiem co zrobić aby zatrzymać tę pętlę: for( int i = 0; i < 3000; i++ ) { std::getline( std::cin, data[ i ] ); if( data[ i ] == '/n' || i == 2999 ) { r_count = i + 1; break; } } |
|
colorgreen19 |
» 2014-10-12 13:26:03 liczba wierszy nie przekracza 3000 |
wydaje mi sie ze to nie oznacza ze zawsze bedziesz mial 3000 linijek. W tresci zadania nie ma nic o wyszukaniu EOFa. Nie możesz po prostu wcztywać dopuki !file.eof() ? e2: rozumiem ze chcesz przez cin'a wczytywać 3000 wyrażen? jak w takim razie takie wyrazenie bedzie mialo w sobie zakodowany EOF? e1: w pętli ktorej "nie mozesz" zatrzmac masz chyba błąd. masz '/n' a powinno byc '\n' |
|
Monika90 |
» 2014-10-12 13:49:54 const int max = 3000; std::string data[ max ]; int i = 0; while( i < max && std::getline( std::cin, data[ i ] ) ) ++i;
std::cout << "wczytano " << i << "wierszy\n";
A tak w ogóle, to tablice nie są w tym zadaniu potrzebne. |
|
starter Temat założony przez niniejszego użytkownika |
» 2014-10-12 15:13:26 @up Monika90 wielkie dzięki, teraz po wpisaniu Ctrl+Z (to podobno skrót) przerywa wczytywanie. Niestety po wysłaniu zadania nie przechodzi ono wszystkich testów. Czy w kodzie jest może jakiś błąd wpływający na wynik? #include <iostream>
int main() { std::string data[ 3000 ]; int r_count = 0; int o_count = 0; int c_count = 0; std::string answer[ 3000 ]; std::cin.clear(); std::cin.sync(); while( r_count < 3000 && std::getline( std::cin, data[ r_count ] ) ) ++r_count; for( int i = 0; i < r_count; i++ ) { for( int j = 0; j < data[ i ].length(); j++ ) { if( data[ i ][ j ] == '(' ) o_count++; else if( data[ i ][ j ] == ')' ) c_count++; } if( o_count == c_count ) answer[ i ] = "TAK"; else answer[ i ] = "NIE"; o_count = 0; c_count = 0; } for( int i = 0; i < r_count; i++ ) { std::cout << answer[ i ]; if( i + 1 < r_count ) std::cout << std::endl; } return 0; }
Zaznaczę, że nie znam konstrukcji testów, ani danych jakie wprowadzają. |
|
« 1 » |