Lỗi đọc File khi sử dụng seekg trong C++

#include<iostream>
#include<fstream>
using namespace std;
struct PhanSo{
    int TuSo, MauSo;
};
typedef struct PhanSo PHANSO;

void xuatPhanSo(PHANSO ps){
    cout << ps.TuSo << "/" << ps.MauSo << endl;
}

int main(void){
    PHANSO ps;
    ifstream FileInput("INPUT.txt");
    if (FileInput.fail()){
        cout << "File khong ton tai!";
        return 0;
    }
    char c;
    FileInput >> ps.TuSo;
    FileInput.seekg(1, ios_base::cur);
    //FileInput >> c;
    FileInput >> ps.MauSo;
    FileInput.close();

    xuatPhanSo(ps);
    return 0;
}

Đây là File Input của em:

12/5
3/4

Chào mọi người, em định dùng seekg để bỏ qua ký tự ‘/’ và đọc tiếp phần mẫu số, nhưng sau khi đọc xong thì kết quả trả về lại là 12/3. Nếu em sử dụng biến c để lưu ký tự ‘/’ thay vì seekg thì ko bị lỗi này. Trong trường hợp File chỉ có 1 phân số 12/5 thì dùng seekg vẫn cho ra kết quả đúng. Vậy vấn đề này là do đâu ạ?

Sau khi đọc xong 12 thì mình có dùng seekg để bỏ qua / và đọc tiếp 5 mà. Nhưng nếu trong trường hợp file chỉ có 1 phân số là 12/5 thì chương trình vẫn chạy được bình thường và in ra kết quả đúng

FileInput.seekg(1, ios_base::cur);

sao ko xài ignore :V FileInput.ignore(1); hay FileInput.ignore();

literally đọc là “bỏ qua 1 ký tự” :V

6 Likes

[Windows-specific] Vậy là giống trường hợp này https://stackoverflow.com/questions/27055771/using-seekg-in-text-mode

1 kí tự != 1 byte.

5 Likes

seek tell gì tốt nhất là xài cho binary file i/o, còn bình thường thì đừng xài :V

6 Likes

Em cảm ơn mọi người nhiều :smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?