In thông tin mặt hàng bị sai

e có 1 bài tập như sau:
Thông tin về sản phẩm gồm có: 1. mã sản phẩm là số nguyên tự động tăng; 2. tên sản phẩm; 3. giá là số thực gồm giá nhập, giá xuất.
Viết chương trình cho phép ghi ra file nhị phân(yêu cầu file được đặt tên là mã sinh viên và tên file mở rộng .bin ) thực hiện 3 chức năng:

  1. thêm mới
  2. cập nhật giá theo mã sản phẩm
  3. hiển thị danh sách sản phẩm có chênh lệch giá xuất với giá nhập giảm dần

Mô tả dữ liệu vào:

  • Dòng thứ nhất là lựa chọn chức năng thực hiện
  • Dòng thứ hai
    • Nếu lựa chọn ở dòng thứ nhất là 1 thì nhập số sản phẩm sẽ thêm mới
    • Nếu lựa chọn ở dòng thứ nhất là 2 thì nhập mã sản phẩm sẽ sửa đổi
  • Dòng tiếp theo là thông tin sản phẩm

Mô tả dữ liệu ra:

  • Nếu lựa chọn là 1 thì in ra số sản phẩm đã được thêm
  • Nếu lựa chọn là 2 thì in ra mã sản phẩm đã được sửa
  • Nếu lựa chọn là 3 thì hiển thị danh sách theo mô tả dưới đây: giá lấy 2 chữ số thập phân, các thông tin cách nhau một khoảng trắng

Một trường hợp sử dụng chương trình

INPUT OUTPUT
1
2
banh ngot
5.50 8.50
nuoc ngot
4.50 6.50
2
2
2
nuoc giai khat
4.50 10.50
2
3 2 nuoc giai khat 4.50 10.50
1 banh ngot 5.50 8.50

khi đọc từ file, e muốn biết có bao nhiêu mặt hàng trong file thì e viết 1 hàm trả về số mặt hàng trong file như sau:


nhưng giá trị trả về này đếm cả 3 số trong 1 mặt hàng ( sồ thứ tự, giá nhập, giá xuất) là s ạ?

Code của bạn:

struct hoso{
	int stt;
	char ten[100];
	float nhap;
	float xuat;
};
 
int count(){
	int c=0;
	hoso goods[100];
	FILE *p = fopen( "B18DCCN526.txt", "r");
	char s[60];
	while( fscanf( p, "%d", &goods[c] . stt) != EOF){
		fgets( goods[c] . ten, 40, p);
		fscanf( p, "%.2f%.2f" ,&goods[c] . nhap, &goods[c] . xuat);
		c++;	
	}
	fclose(p);
	return c;
}
  • Thứ nhất: Để sử dụng struct do mình tự định nghĩa bạn có thể làm theo 2 cách sau:
    • Khai báo bằng typedef struct {} struct_name; rồi gọi trong chg trình struct_name variable_name;
    • Định nghĩa như bạn và gọi trong chg trình struct hoso goods[];
  • Thứ hai: Chỗ %.2f %.2f vì là trong hàm fscanf nên phải để là %f %f.
  • Thứ ba: Biến char s[] của bạn k dùng đến.
2 Likes

cảm ơn anh nhưng e vẫn phải sửa while( fscanf( p, “%d”, &goods[c] . stt) != EOF) thành while( fscanf( p, “%d\n”, &goods[c] . stt) != EOF) liệu có hàm nào như kiểu fflush(stdin) để nó bỏ qua “\n” không?

Tương tự như fflush(stdin) đối với file thì bạn có thể dùng while (fgetc(file) != '\n');
Mà bản thân fflush() nó nhận vào đối số kiểu FILE nên bạn cũng có thể dùng fflush(file);

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