Tôi đã tự hỏi liệu ai đó có thể giúp tôi tìm ra cách đọc từ một tệp văn bản trong C++, ký tự theo ký tự. Bằng cách đó, tôi có thể có một vòng lặp while (trong khi vẫn còn văn bản bên trái), nơi tôi lưu trữ ký tự tiếp theo trong tài liệu văn bản trong biến tạm thời để tôi có thể làm điều gì đó với nó, sau đó lặp lại quy trình với ký tự tiếp theo. Tôi biết cách mở tệp và mọi thứ, nhưng temp = textFile.getchar()
dường như không hoạt động. Cảm ơn trước.Cách đọc từ một tệp văn bản, ký tự theo ký tự trong C++
Trả lời
Re: textFile.getch()
, bạn đã tạo ra điều đó hay bạn có tham chiếu cho biết nó có hoạt động không? Nếu đó là thứ hai, hãy loại bỏ nó. Nếu đó là cái cũ, đừng làm thế. Nhận một tài liệu tham khảo tốt.
char ch;
textFile.unsetf(ios_base::skipws);
textFile >> ch;
Bạn có thể thử một cái gì đó như:
char ch;
fstream fin("file", fstream::in);
while (fin >> noskipws >> ch) {
cout << ch; // Or whatever
}
'noskipws': điểm tốt. –
@PeteBecker Vâng, tôi thích nó vì đó là những gì 'C' làm khi đọc các ký tự đơn. – cnicutar
Giả sử rằng temp
là một char
và textFile
là một std::fstream
phái sinh ...
Cú pháp bạn đang tìm kiếm là
textFile.get(temp);
Không có lý do không sử dụng C <stdio.h>
trong C++, và trên thực tế nó thường là lựa chọn tối ưu.
#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
}
Chủ đề cũ, v.v ... Nhưng câu hỏi là "từ tệp". Bạn không thể sử dụng 'getchar' để đọc từ bất kỳ thứ gì khác với stdin. 'getc' là thứ bạn muốn; và bạn sẽ phải mở một con trỏ tập tin ở đâu đó. – josaphatv
Để báo Bjarne Stroustrup: "Các nhà điều hành >> dành cho định dạng đầu vào, đó là, đọc các đối tượng của một loại dự kiến và định dạng ở đâu đây không phải là mong muốn và chúng tôi muốn đọc charactes như nhân vật và sau đó. kiểm tra chúng, chúng tôi sử dụng các hàm get(). "
char c;
while (input.get(c))
{
// do something with c
}
@cnicutar và @Pete Becker đã chỉ ra khả năng sử dụng noskipws
/unset skipws
để đọc một nhân vật tại một thời điểm mà không cần bỏ qua các ký tự khoảng trắng ở đầu vào.
Một khả năng khác là sử dụng số istreambuf_iterator
để đọc dữ liệu. Cùng với điều này, tôi thường sử dụng một thuật toán chuẩn như std::transform
để thực hiện việc đọc và xử lý.
Chỉ cần ví dụ, chúng ta hãy giả sử chúng ta muốn làm một mật mã Caesar giống như, sao chép từ đầu vào tiêu chuẩn để đầu ra tiêu chuẩn, nhưng thêm 3 đến từng ký tự in hoa, vì vậy A
sẽ trở thành D
, B
có thể trở thành E
, vv . (và cuối cùng, nó sẽ quấn xung quanh để XYZ
chuyển đổi sang ABC
Nếu chúng ta sẽ làm điều đó trong C, chúng tôi thường muốn sử dụng một cái gì đó vòng lặp như thế này:.
int ch;
while (EOF != (ch = getchar())) {
if (isupper(ch))
ch = ((ch - 'A') +3) % 26 + 'A';
putchar(ch);
}
để làm điều tương tự trong C++, tôi lẽ viết mã nhiều như thế này:
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;});
Làm công việc theo cách này, bạn nhận được ký tự liên tiếp như các giá trị của tham số truyền cho (trong trường hợp này) chức năng lambda (mặc dù bạn có thể sử dụng một functor rõ ràng thay vì một lambda nếu bạn thích).
Giải pháp tuyệt vời! – 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.
Đây là chức năng phong cách C++ mà bạn có thể sử dụng để đọc tệp char bằng 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. Đọc từ ký tự tệp văn bản theo ký tự
- 2. Đọc một ký tự tệp theo ký tự trong C
- 3. Làm cách nào để đọc ký tự đầu vào theo ký tự trong Java?
- 4. Các vấn đề về Kerning khi vẽ ký tự văn bản theo ký tự
- 5. bash: đọc văn bản từ một chuỗi một ký tự cùng một lúc, với khoảng trắng
- 6. Đọc các ký tự không phải ASCII từ một tệp văn bản
- 7. Ký tự cuối dòng từ dòng được đọc từ tệp văn bản, sử dụng Python
- 8. Cách chèn ký tự dòng mới sau một số ký tự cố định trong một tệp
- 9. FileHelpers - Cách đọc trong ký tự ®?
- 10. Đọc các ký tự unicode từ tệp csv
- 11. Kiểm tra dòng cho các ký tự không in được trong khi đọc tệp văn bản
- 12. Cách đọc các ký tự không giới hạn trong C
- 13. Nhập tệp văn bản dưới dạng chuỗi ký tự đơn
- 14. C# Nút Văn bản Các ký tự Unicode
- 15. Đọc các ký tự từ một từ? Java
- 16. Các ký tự dòng mới trong vùng văn bản tăng độ dài văn bản trong C#
- 17. Mã hóa ký tự và chuỗi ký tự trong C++
- 18. Remove chuỗi giữa 2 ký tự từ chuỗi văn bản
- 19. Làm thế nào để đọc một chuỗi ký tự theo ký tự dưới dạng một phạm vi trong D?
- 20. Đọc tệp văn bản có ký tự không phải ASCII bằng mã hóa không xác định
- 21. đọc 8 ký tự đầu tiên của tệp văn bản với bash
- 22. Làm cách nào để tìm mã ký tự của một ký tự đặc biệt trong trình soạn thảo văn bản?
- 23. đọc trong một tệp văn bản có ký tự SUB (1a) (Control-Z) trong R trên Windows
- 24. Thay thế các ký tự trong một tệp
- 25. Cách đọc các ký tự tiếng Thụy Điển đúng từ một tệp txt
- 26. Tập lệnh liệt kê tất cả các ký tự riêng biệt trong một tệp văn bản
- 27. Haskell: lỗi từ vựng trong chuỗi ký tự/ký tự ở ký tự 'i'
- 28. Đếm các dòng, từ và ký tự trong một tệp văn bản bằng cách sử dụng Python
- 29. Xóa hai ký tự cuối cùng khỏi mỗi dòng trong một tệp văn bản
- 30. WinForms: Cách kiểm tra số ký tự tối thiểu trong hộp văn bản trong C#?
Điều này không bỏ qua khoảng trống? – Lalaland
Yup. Đó là lý do tại sao @cnicular sử dụng 'noskipws'. Tôi vừa chỉnh sửa của tôi để sửa lỗi này. –