01/10/2018, 16:48

Lỗi khi xuất thông tin do fgets()

mình có đoạn code dùng để thêm vào một công nhân, duyệt và in ra danh sách các công nhân ra màn hình, chạy thì không có lỗi nhưng lúc dùng duyet() thì nó lại in ra lung tung.

typedef struct {
    char mscn[6], name[20], team[20];
    int num_work_day;
    float salary_each_day, monney;
}Worker;
void add(void) {
    Worker worker;
    FILE* file = fopen("file.txt", "r+b");
    if(file) {
        char mscn[6];
        printf("mscn : ");
        fgets(mscn, sizeof(mscn), stdin);
        fflush(stdin);
        rewind(file);
        while(fread(&worker, sizeof(Worker), 1, file)) {
            if(strcmp(mscn, worker.mscn) == 0) {
                printf("mscn bi trung");
                return;
            }
        }
        strcpy(worker.mscn, mscn);
        printf("name : ");
        fgets(worker.name, sizeof(worker.name), stdin);
        fflush(stdin);
        printf("team : ");
        fgets(worker.team, sizeof(worker.name), stdin);
        fflush(stdin);
        printf("num workdays : ");
        scanf("%d", &worker.num_work_day);
        fflush(stdin);
        printf("day's salary : ");
        scanf("%f", &worker.salary_each_day);
        fflush(stdin);
        worker.monney = tinh_luong(worker.num_work_day, worker.salary_each_day);
        fseek(file, 0, SEEK_END);
        fwrite(&worker, sizeof(Worker), 1, file);
        fclose(file);
    } else
        printf("_______ERORR______");
}
void duyet(void) {
    Worker worker;
    FILE* file = fopen("file.txt", "rb");
    if(!file)
        printf("__ERORR__");
    else {
        rewind(file);
        printf("%-6s %-20s %-10s %4s %13s %13s
", "macn", "name", "team", "num workdays", "day's salary", "money");
        while(fread(&worker, sizeof(Worker), 1, file))
            printf("%-6s %-20s %-10s %4d %13.0f %13.0f
", worker.mscn, worker.name, worker.team, worker.num_work_day,
                   worker.salary_each_day, worker.monney);
        fclose(file);
    }
}

nhưng nếu mình thay fgets(string, sizeof(string), stdin); bằng gets(string); ở hàm add thì nó lại chạy bình thường, mình không hiểu được sao nó lại thế, có ai giải thích giúp với

void add(void) {
    Worker worker;
    FILE* file = fopen("file.dat", "r+b");
    if(file) {
        char mscn[6];
        printf("mscn : ");
        //fgets(mscn, sizeof(mscn), stdin);
        gets(mscn);
        fflush(stdin);
        rewind(file);
        while(fread(&worker, sizeof(Worker), 1, file)) {
            if(strcmp(mscn, worker.mscn) == 0) {
                printf("mscn bi trung");
                return;
            }
        }
        strcpy(worker.mscn, mscn);
        printf("name : ");
        //fgets(worker.name, sizeof(worker.name), stdin);
        gets(worker.name);
        fflush(stdin);
        printf("team : ");
        //fgets(worker.team, sizeof(worker.name), stdin);
        gets(worker.team);
        fflush(stdin);
        printf("num workdays : ");
        scanf("%d", &worker.num_work_day);
        fflush(stdin);
        printf("day's salary : ");
        scanf("%f", &worker.salary_each_day);
        fflush(stdin);
        worker.monney = tinh_luong(worker.num_work_day, worker.salary_each_day);
        fseek(file, 0, SEEK_END);
        fwrite(&worker, sizeof(Worker), 1, file);
        fclose(file);
    } else
        printf("_______ERORR______");
}

Trương Tấn Phát viết 18:53 ngày 01/10/2018

Vấn đề chắc nằm ở kí tự xuống dòng (\n).

fgets() đọc và lưu cả kí tự xuống dòng và cả kí tự null (0x00).
Trong khi gets() lại không lưu kí tự xuống dòng.


A newline character makes fgets stop reading, but it is considered a valid character by the function and **included** in the string copied to str.

A terminating null character is automatically appended after the characters copied to str.

http://www.cplusplus.com/reference/cstdio/fgets/

Bài liên quan
0