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

[C++] Standardowy strumień wejścia - znak końca pliku EOF

Ostatnio zmodyfikowano 2014-10-12 15:13
Autor Wiadomość
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 :)
P-118305
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_linii
Jeż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.
C/C++
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
P-118322
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.
P-118324
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
P-118326
starter
Temat założony przez niniejszego użytkownika
» 2014-10-12 13:01:30
https://drive.google.com/file​/d/0B1KHzE4UnEMWTklsekg1djJrTWs​/view?usp=sharing

To jest treść zadania. Wynika z niej jednoznacznie, że wczytywać mam ze standardowego strumienia.

A oto mój dotychczasowy kod:
C/C++
#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ę:
C/C++
for( int i = 0; i < 3000; i++ )
{
    std::getline( std::cin, data[ i ] );
    if( data[ i ] == '/n' || i == 2999 )
    {
        r_count = i + 1;
        break;
    }
}
P-118329
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'
P-118336
Monika90
» 2014-10-12 13:49:54
C/C++
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.
P-118339
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?

C/C++
#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ą.
P-118349
« 1 »
  Strona 1 z 1