Làm sao để đọc file được cả space?

Em nhập vào chuỗi arr.hoDem, có nhập space sau đó ghi file. rồi tắt chương trình mở lại, em cho đọc file luôn và in ra màn hình thì bị lỗi, hoDem thì chỉ có mỗi họ còn tên đệm thì chuyển sang arr.ten ạ. Em ko biết khắc phục như nào, mong anh chị giúp

int docFile( struct SV arr[], char fileName[]) {
    FILE * f;
    int i = 0;
    f = fopen (fileName, "r");
    while ((fscanf(f, "%10d %10s %20s %15s %10s %10f %10s\n", &arr[i].id, &arr[i].hoDem, &arr[i].ten, 
            &arr[i].gioiTinh, &arr[i].tuoi, &arr[i].diem, &arr[i].xepLoai))!= EOF) {
       i++;
       printf("\n Doc ban ghi thu: %d",i);
    }
    
    printf("\n So luong sinh vien co san trong file la: %d", i);
    fclose (f);
    return i;
}
 
void ghiFile(struct SV arr[], int n, char fileName[]) {
    FILE * f;
    f = fopen (fileName,"w");
    for(int i = 0;i < n;i++){
        fprintf(f, "%10d %10s %20s %15s %10s %10.2f %10\n", arr[i].id, &arr[i].hoDem, arr[i].ten,
		arr[i].gioiTinh, arr[i].tuoi, arr[i].diem, arr[i].xepLoai);
    }
    fclose (f);
}

Trước khi ghi vào file thì em có in ra màn hình như này

STT        ID          Ho Dem              Ten       Gioi Tinh      Tuoi         Diem      Xep Loai
1          2         Nguyen Hoang            Tuan        Nam         23       9.00          A

Sau khi lưu vào file, em tắt chương trình và chạy lại rồi cho in ra màn hình:

  STT        ID          Ho Dem              Ten       Gioi Tinh      Tuoi         Diem      Xep Loai
   1          2               Nguyen           Hoang       Tuan        Nam      23.00       9.00

Bạn tự đọc cả dòng và tách thôi.
Vấn đề mình đặt ra: tên người đâu chỉ có 3 từ đâu.
Còn cách khác là bạn phân tách các cụm dữ liệu bằng kí tự (hoặc cụm kí tự) khác với dấu cách.
Ví dụ sau mình dùng kí tự thanh dọc | để phân tách.

STT       |ID         |Ho Dem             |Ten      |Gioi Tinh     |Tuoi        |Diem     |Xep Loai
1         |2        |Nguyen Hoang           |Tuan       |Nam        |23      |9.00         |A

Chắc bạn có thể thắc mắc: "Làm sao để đọc phân tách bằng kí tự | với fscanf()?
Bạn hoàn toàn làm được nếu như bạn đọc và hiểu được tài liệu về fscanf() (scanf() cũng tương tự).
https://www.cplusplus.com/reference/cstdio/fscanf/ phần format.
%[^|]

Một gợi ý

https://onlinegdb.com/LAKodjbWa

3 Likes

Đọc từng line.
Phân tách 1 dòng thành các “mảnh nhỏ” bằng getline và dấu “|”.
Sau đó trim() các “mảnh nhỏ” thu được.

3 Likes

Bài đọc và ghi data vào file trên trường em không được dạy và cô thầy bảo về đọc thêm. Cảm ơn bác đã góp ý cho em và giúp em hiểu biết nhiều hơn… <3

cảm ơn bác nhìu nha <3

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