Thao tác file với C

Trong bài viết này tui muốn nói về cách đọc file mà trong file có dấu sử dụng tab và khoảng trắng. Ví dụ mình có một file có định dạng thế này.

 

Mình muốn lấy ra hai thông tin, thông tin thứ nhất là thứ tự công ty, thông tin thứ hai là tên đầy đủ công ty (tên phải theo định dạng: Cong Ty FPT), hãy chú ý tới khoảng trắng. Bạn cần phải phân tích trước khi đọc file, nếu chúng ta dùng fscanf để đọc dữ liệu trong mỗi dòng của file, mà fscanf nó sẽ ngắt khi gặp khoảng trắng hay dấu tab và tiếp tục xử lý data ở lượt khác, vậy với cụm từ  “Cong Ty FPT” fscanf sẽ được xử lý và lưu vào 3 biến (biến 1 = Cong, biến 2=Ty, biến 3 = FPT) … nếu làm theo kiểu này e không ổn nhỉ.

 

Ok, giờ chúng ta cùng nhau phân tích các đọc file ở trên, yêu cầu là cần lấy hai thông tin yêu cầu ở trên, do đó mình sẽ có một struct như sau :

typedef struct NhaCungCap {
	int  ma;
	char *ten;	
}NhaCungCap;

Tiếp đó thay vì cách chúng ta đọc file theo kiểu hay sử dụng ở trên thì hay thử suy nghĩ theo cách này. Chúng ta sẽ đọc tất cả mọi thứ trên một dòng của file, ví dụ dòng một mình lưu vào một biến line = “1 Cong Ty FPT”, khi đã có được chuỗi này rồi chúng ta sẽ thực hiện việc cắt chuỗi, cắt làm hai chuỗi chuỗi 1 là thứ tự “1”, chuỗi hai là “Cong Ty FPT” hai chuỗi phân cách nhau bởi dấu tab.Trong trường hợp này mình sử dụng phương thức cắt chuỗi như sau:

// ham thuc hien cat chuoi cua mot string
char* substr(char *c,int start,int end) { 
	if(end >= (int)strlen(c)) { 
		printf("The end position seeked is greater than string length \n"); 
		return "Try Again"; 
	} 

	char *temp = (char*)malloc(end - start + 1); 
	int count = 0; 
	for(int i=start;i <=end;i++){ 
		temp[count]=c[i]; 
		count++; 
	} 
	temp[count] = ''; 
	return temp; 
}

Ok, mình đã có hàm này rồi thì việc tiếp theo mình cần làm là xác định vị trí của dấu tab trong chuỗi mình lấy được tại mỗi dòng của file.Giờ là đoạn code đọc file.

// lay tat ca thong tin cua nha cung cap tu file danh_sach_cong_ty.txt
void Lay_Danh_Sach_Nha_Cung_Cap(NhaCungCap Ncc[]){

	char line[40];
	char *stt, *name;
	int index_tab, j=0;
	char *ten_cong_ty;
	fp = fopen("D:\\danh_sach_cong_ty.txt", "r");

	if (fp != NULL){
		while(!feof(fp)){
			fgets(line, 40, fp);	
			for(int i=0; i 0){
				ten_cong_ty = substr(Ncc[j].ten, 8, strlen(Ncc[j].ten)-1);
				if(strlen(ten_cong_ty) > 10) {
					printf("Ten cong ty khong duoc vuot qua 10 ky tu\n");
					exit(0);
				} 
			}
			++j;
		}
		fclose(fp);
	}else{
		printf("cound not open file");
	}
}

Ok, vậy thì vấn đề đã được giải quyết. Trong hàm này tui có sử dụng hàm atoi hàm này để chuyển một chuỗi số sang kiểu integer ( “1” sẽ trở thành 1), điều này để nhằm mục đích là có tính toán gì với nó, nếu bạn hok có gì tính toán tới những con số này thì hok cần làm điều này cũng được.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s