Đọc nhiều dữ liệu cùng dòng trong C

Em chào mọi người ạ. Em mới học phần file trong C và gặp đôi chút vấn đề về 1 bài tập về file như sau ạ.
Đề bài yêu cầu đọc file về cấu trúc bệnh nhân gồm họ và tên, bệnh ( có 3 loại bệnh A,B,C), tuổi lưu trên tệp file văn bản (danhsach.txt) với dòng đầu là số bênh nhân tiếp theo là mỗi dòng gồm thông tin bệnh nhân (3 thông tin trên) cách nhau bằng khoảng trống. Sau đó tạo file bn.txt để sắp xếp bệnh nhân theo thứ tự tên và tính tuổi trung bình người mắc bệnh C
VD file danhsach.txt như sau: image
Vấn đề là em gặp là khi em cố gắng đọc file theo code như sau:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>

typedef struct {
    char HT[30], benh ;
    int tuoi ;
} bn;
void nhap(bn **a, int *n, FILE *fi)
{
	int i ;
	fscanf(fi,"%d\n", n) ;
	*a = (bn*)calloc((*n+5), sizeof(bn)) ;
	for(i=0; i<*n; i++)
	{
		fscanf(fi,"%[^\n] %d %c\n", &(*a)[i].HT,&(*a)[i].tuoi,&(*a)[i].benh) ;

	}
}

thì sẽ bị hiểu cả cụm Nguyen Van An A 77 là tên luôn, nên file bn.txt tạo ra bị sai. Mn cho em hỏi hướng để fix lỗi trên, đọc 3 thông tin trên cùng dòng đc k ạ ? Em cảm ơn ạ

Đúng ra cần có dấu (chấm) phẩy giửa 3 thành phần. Bạn parse theo khoảng trắng, nhưng lưu ý A cũng có thể là tên.

4 Likes

Nếu đề cho sẵn tập tin đầu vào thì phải chịu khó làm, vẫn đọc được. Tên thường có 3 từ, nhưng vẫn có người tên 2, thậm chí 7 và nhiều hơn.

Nhưng nếu đó là tập tin bạn ghi ra xong đọc lại thì bạn nên có kí tự (hoặc nhóm kí tự) để phân cách giữa các thành phần. Có thể là kí tự tab \t, chấm phẩy ;,… bất kì kí tự đặc biệt nào không xuất hiện trong dữ liệu.

3 Likes

dạ đề cho tập tin sẵn nên k có ký tự nào phân cách ấy ạ. Nên em không biết có cách xử lý nào k vì tên k biết có bao nhiêu từ ạ.

Thế thì lấy hết string của 1 dòng ra, rồi tìm vị trí 2 khoảng trắng cuối cùng để biết vị trí cần phân tách. Cần một giải thuật nho nhỏ để giải quyết vấn đề này, và hi vọng bạn tự nghĩ ra được :smiley:

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