2012-09-02 125 views
10

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

2

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; 
+0

Điều này không bỏ qua khoảng trống? – Lalaland

+0

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. –

25

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 
} 
+2

'noskipws': điểm tốt. –

+0

@PeteBecker Vâng, tôi thích nó vì đó là những gì 'C' làm khi đọc các ký tự đơn. – cnicutar

0

Giả sử rằng temp là một chartextFile là một std::fstream phái sinh ...

Cú pháp bạn đang tìm kiếm là

textFile.get(temp); 
1

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 
} 
+1

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

3

Để 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 
} 
8

@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).

+1

Giải pháp tuyệt vời! – 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

Đâ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(); 
} 
Các vấn đề liên quan