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
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;
można spróbować coś takiego:
char ch;
fstream fin("file", fstream::in);
while (fin >> noskipws >> ch) {
cout << ch; // Or whatever
}
'noskipws': dobry punkt. –
@PeteBecker Tak, podoba mi się, bo tak właśnie robi "C" podczas czytania pojedynczych znaków. – cnicutar
Zakładając, że temp
jest char
i textFile
jest pochodną std::fstream
...
Składnia szukasz jest
textFile.get(temp);
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
}
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
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
}
@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).
Way cool solution! – cnicutar
//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.
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();
}
- 1. Jak czytać i pisać do pliku tekstowego w C++?
- 2. Odczytuj plik znak po znaku w Rust
- 3. jak czytać bajt po bajcie z pliku
- 4. pierwszy znak czytania z pliku tekstowego: i »¿
- 5. Podczas pętli, jak czytać z drugiego wiersza pliku tekstowego
- 6. Odczytaj zarówno znak jak i linię z pliku tekstowego
- 7. Przetwarzaj znaki UTF-8 w C z pliku tekstowego
- 8. Jak czytać wiersz pliku gzip po linii?
- 9. Problemy z kerningiem podczas rysowania tekstu znak po znaku
- 10. Czy czytać wiele tabel z jednego pliku tekstowego?
- 11. Czytanie z pliku tekstowego w języku C#
- 12. czytanie pliku tekstowego w C#
- 13. Czytanie pliku tekstowego z Androidem
- 14. Jak czytać wiersz z pliku w PowerShell
- 15. Jak czytać kule z pliku RTF
- 16. C++ wydajność odczytu pliku tekstowego
- 17. Czytanie z pliku tekstowego - Cel C
- 18. Usuwanie znaku BOM w pliku
- 19. Pliku pliku tekstowego z Python
- 20. Jak usunąć linię z pliku tekstowego w języku C#?
- 21. Jak czytać z plików z Files.lines (...). ForEach (...)?
- 22. wyczyść dane wewnątrz pliku tekstowego w C++
- 23. C# sporządziły sprawozdania - znak @ (w/strudel znaku) odpytuje
- 24. Jak czytać cyrylicę w Unicode w C++?
- 25. C# wyszukiwanie dużego pliku tekstowego
- 26. C#: ogon jak program do pliku tekstowego
- 27. Jak usunąć wiersze danych w środku pliku tekstowego z Ruby
- 28. Usuwanie pierwszy wiersz pliku tekstowego w C#
- 29. przekierowanie wyjścia do pliku tekstowego w C#
- 30. Jak wydrukować znak procentu (%) w c
Czy to nie pomija miejsc? – Lalaland
Yup. Dlatego @cnicular używał 'noskipws'. Właśnie zredagowałem moje, żeby to naprawić. –