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

c++ getline/pliki

Ostatnio zmodyfikowano 2016-12-04 20:27
Autor Wiadomość
dakruzz
Temat założony przez niniejszego użytkownika
c++ getline/pliki
» 2016-12-04 14:04:44
Mam problem z opcją getline w stringu
C/C++
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream wejscie;
    ofstream wyjscie;
    string z;
   
   
    wejscie.open( "dane.txt" );
    if( !wejscie )
    {
        cout << "niepoprawny plik";
        return 0;
    }
   
    wyjscie.open( "wyjscie.txt" );
   
    while( !wejscie.eof() )
    {
        cout << getline( wejscie, z );
    }
    return 0;
}
Nie wiem czemu, ale wyświetla mi sam adres, a nie zdanie
Wyswietla: 0x6afe640x6afe640x6afe640x6afe64

Dane pliku(dane.txt):
ala ma kota
kot ma ale
ala nie ma kota
kot nie ma ali

Plan jest taki, żeby każdy wiersz zaczynający się na "a" wrzucił do nowego pliku(wyjscia), ale nie mogę ogarnąć tego getline i przez to całe zadanie mi pada.
P-154472
karambaHZP
» 2016-12-04 14:24:28
http://www.cplusplus.com​/reference/string/string​/getline/
Poza tym uzywanie eof() w warunku pętli jest dość ryzykowne.
P-154473
dakruzz
Temat założony przez niniejszego użytkownika
» 2016-12-04 14:36:23
jestem dość świeży, więc o ile masz wolny czas to proszę o wytłumaczenie dlaczego to jest ryzykowane. Mam zastąpić to if, albo for?

Dzięki za link, teraz mam kolejny problem(zapewne typowy dla świeżaka):
C/C++
while( !wejscie.eof() )
{
    if( z == 'a' )
         getline( wejscie, z );
   
    cout << z;
}
 if(z=='a')  - tutaj jest błąd

Robiąc to inaczej też wyskakuje mi błąd
C/C++
while( !wejscie.eof() )
{
    wejscie >> z;
    if( z == z1 ) //cin<<z1 wybieramy jaka litera
    {
        wejscie.getline( z, 255 ); //zamienilem ze stringa na char
        cout << z;
    }
   
}
 i też przy if'ie
P-154475
carlosmay
» 2016-12-04 17:58:28
ryzykowne
Pewnie chodzi o użycie ostatniej linii z pliku dwukrotnie.

Co do błędów, wklejaj ich treść. Łatwiej znaleźć ów błąd i szybciej nauczysz je czytać.
P-154486
dakruzz
Temat założony przez niniejszego użytkownika
» 2016-12-04 19:05:26
Dzięki za wszelkie rade :)

Przy takim kodzie:
C/C++
char dane[ 200 ];
char znak_zamiany;
cin >> znak_zamiany;
while( !wejscie.eof() )
{
    wejscie >> dane;
    if( dane == znak_zamiany )
    {
        wejscie.getline( z, 200 );
        cout << dane;
    }
}
 Wyskakuje błąd: ISO C++ forbids comparison between pointer and integer [-fpermissive]|

Natomiast przy takim:
C/C++
string dane[ 200 ];
string znak_zamiany;
cin >> znak_zamiany;
while( !wejscie.eof() )
{
    wejscie >> dane;
    if( dane == znak_zamiany )
    {
        getline( wejscie.dane );
        cout << dane;
    }
}
 Wyskakuje: error: no match for 'operator>>' (operand types are 'std::ifstream {aka std::basic_ifstream<char>}' and 'std::string [200] {aka std::basic_string<char> [200]}')|
P-154492
carlosmay
» 2016-12-04 19:58:42
no match for 'operator>>' (operand types are 'std::ifstream {aka std::basic_ifstream<char>}' and 'std::string [200] {aka std::basic_string<char> [200]}')
Wygląda na brak dołączonego nagłówka
#include <string>


Metoda
std::getline();
 zwraca taką samą wartość jaką zwraca strumień użyty w pierwszym argumencie,
więc możesz użyć jej bezpośrednio w warunku. Koniec pliku == nieudane wczytywanie == warunek pętli niespełniony.

C/C++
#include <string>
#include <fstream>
#include <iostream>
#include <cctype>

int main()
{
    std::ifstream fin( "test.txt" );
    std::ofstream fout( "test_out.txt" );
    if( fin && fout ) {
        std::string tmp { };
        while( std::getline( fin, tmp ) ) {
            if( std::tolower( tmp[ 0 ] ) == 'a' ) {
                fout << tmp.data() << '\n';
            }
        }
    }
    else {
        std::cerr << "lipa\n";
    }
}
P-154502
dakruzz
Temat założony przez niniejszego użytkownika
» 2016-12-04 20:27:49
Wielkie Dzięki! pozwoliłem sobie troche przerobić go na bardziej czytelny dla mnie

Problem rozwiązany :)
P-154505
« 1 »
  Strona 1 z 1