2012-09-02 15 views
10

Zastanawiam się, czy ktoś może mi pomóc dowiedzieć się, jak czytać z pliku tekstowego w C++, znak po znaku. W ten sposób mógłbym mieć pętlę while (dopóki pozostało jeszcze tekstu), w której zapisuję następną postać w dokumencie tekstowym w zmiennej tymczasowej, aby móc coś z nią zrobić, a następnie powtórzyć proces z następną postacią. Wiem, jak otworzyć plik i wszystko, ale wydaje się, że temp = textFile.getchar() nie działa. Z góry dziękuję.Jak czytać z pliku tekstowego, znak po znaku w C++

Odpowiedz

2

Re: textFile.getch(), czy to wymyśliłeś, czy masz referencję, która mówi, że powinna działać? Jeśli to drugie, pozbądź się go. Jeśli to ta pierwsza, nie rób tego. Uzyskaj dobre referencje.

char ch; 
textFile.unsetf(ios_base::skipws); 
textFile >> ch; 
+0

Czy to nie pomija miejsc? – Lalaland

+0

Yup. Dlatego @cnicular używał 'noskipws'. Właśnie zredagowałem moje, żeby to naprawić. –

25

można spróbować coś takiego:

char ch; 
fstream fin("file", fstream::in); 
while (fin >> noskipws >> ch) { 
    cout << ch; // Or whatever 
} 
+2

'noskipws': dobry punkt. –

+0

@PeteBecker Tak, podoba mi się, bo tak właśnie robi "C" podczas czytania pojedynczych znaków. – cnicutar

0

Zakładając, że temp jest char i textFile jest pochodną std::fstream ...

Składnia szukasz jest

textFile.get(temp); 
1

Nie ma powód, aby nie używać C <stdio.h> w C++, a tak naprawdę jest to często optymalny wybór.

#include <stdio.h> 

int 
main() // (void) not necessary in C++ 
{ 
    int c; 
    while ((c = getchar()) != EOF) { 
     // do something with 'c' here 
    } 
    return 0; // technically not necessary in C++ but still good style 
} 
+1

Stary wątek, itp. Ale pytanie brzmi "z pliku." Nie możesz użyć 'getchar' do odczytu z niczego innego niż stdin. 'getc' jest tym, co chcesz; i będziesz musiał gdzieś otworzyć wskaźnik pliku. – josaphatv

3

Cytując Bjarne Stroustrup: "The >> operator jest przeznaczony do wejścia sformatowany, to jest czytanie obiektów oczekiwanego typu i formatu jeżeli nie jest to pożądane i chcemy czytać Charactes jak znaki czasu. zbadaj je, używamy funkcji get(). "

char c; 
while (input.get(c)) 
{ 
    // do something with c 
} 
8

@cnicutar i @Pete Becker już zwrócił uwagę na możliwość wykorzystania noskipws/wyłączania skipws odczytać znak na raz bez pomijania przez białych znaków w danych wejściowych.

Inną możliwością jest użycie istreambuf_iterator do odczytania danych. Oprócz tego generalnie używałbym standardowego algorytmu, takiego jak std::transform, do odczytu i przetwarzania.

Wystarczy na przykład, załóżmy, że chcieliśmy zrobić Cezara jak szyfr, kopiowanie ze standardowego wejścia na standardowe wyjście, ale dodanie 3 do każdego górnego liter, tak A staną D, B może stać E itp . (i na koniec, byłoby owinąć wokół tak XYZ konwertowane do ABC

Jeśli mieliśmy zamiar zrobić w C, my zazwyczaj użyć czegoś takiego: pętla.

int ch; 
while (EOF != (ch = getchar())) { 
    if (isupper(ch)) 
     ch = ((ch - 'A') +3) % 26 + 'A'; 
    putchar(ch); 
} 

do zrób to samo w C++ prawdopodobnie napisać kod więcej tak:

std::transform(std::istreambuf_iterator<char>(std::cin), 
       std::istreambuf_iterator<char>(), 
       std::ostreambuf_iterator<char>(std::cout), 
       [](int ch) { return isupper(ch) ? ((ch - 'A') + 3) % 26 + 'A' : ch;}); 

wykonuje zadania w ten sposób, otrzymasz kolejne znaki jako wartości parametru przekazanego (w tym przypadku) Funkcja lambda (choć można użyć wyraźne funktor zamiast lambda, jeśli wolisz).

+1

Way cool solution! – cnicutar

4
//Variables 
    char END_OF_FILE = '#'; 
    char singleCharacter; 

    //Get a character from the input file 
    inFile.get(singleCharacter); 

    //Read the file until it reaches # 
    //When read pointer reads the # it will exit loop 
    //This requires that you have a # sign as last character in your text file 

    while (singleCharacter != END_OF_FILE) 
    { 
     cout << singleCharacter; 
     inFile.get(singleCharacter); 
    } 

    //If you need to store each character, declare a variable and store it 
    //in the while loop. 
1

Oto stylowa funkcja C++, której można używać do odczytywania plików char przez char.

void readCharFile(string &filePath) { 
    ifstream in(filePath); 
    char c; 

    if(in.is_open()) { 
     while(in.good()) { 
      in.get(c); 
      // Play with the data 
     } 
    } 

    if(!in.eof() && in.fail()) 
     cout << "error reading " << filePath << endl; 

    in.close(); 
}