2016-01-14 22 views
6
#include <stdio.h> 
#include <stdlib.h> 

#define FILE_NAME "ff.txt" 

int main() {   
    char x[10],y[10]; 
    FILE *fp; 
    fp = fopen(FILE_NAME, "r+"); 
    if (fp == NULL) { 
     printf("couldn't find %s\n ",FILE_NAME); 
     exit(EXIT_FAILURE);   

    } 
    fprintf(fp,"Hello2 World\n"); 
    fflush(fp); 
    fscanf(fp,"%s %s",x,y); 
    printf("%s %s",x,y); 
    fclose(fp); 
    return 0; 
} 

Đây là phiên bản được luộc xuống của những gì tôi đang cố gắng thực hiện. Mã này không in bất kỳ thứ gì trong bảng điều khiển. Nếu tôi xóa cuộc gọi fprintf, nó sẽ in 2 chuỗi đầu tiên trong tệp, cho tôi số Hello2 World. Tại sao chuyện này đang xảy ra? Ngay cả sau khi tôi fflush các fp?Sử dụng fscanf và fprintf cùng nhau trong C

Trả lời

6

Sau fprintf(), con trỏ tệp trỏ đến cuối tệp. Bạn có thể sử dụng fseek() để thiết lập filepointer vào lúc bắt đầu của tập tin:

fprintf(fp,"Hello2 World\n"); 
fflush(fp); 
fseek(fp, 0, SEEK_SET); 
fscanf(fp,"%s %s",x,y); 

Hoặc thậm chí tốt hơn theo đề nghị của @ Peter, sử dụng rewind():

rewind(fp); 

rewind:

Các end-of-file và các chỉ báo nội bộ lỗi liên quan đến luồng sẽ bị xóa sau khi cuộc gọi thành công đến chức năng này và tất cả các hiệu ứng từ các cuộc gọi trước đến ungetc trên luồng này sẽ bị xóa.

Trên luồng mở để cập nhật (đọc + ghi), cuộc gọi để tua lại cho phép chuyển đổi giữa đọc và viết.

Luôn luôn kiểm tra mã trả lại là fscanf() quá.

Để tránh lỗi tràn bộ đệm, bạn có thể sử dụng:

fscanf(fp,"%9s %9s",x,y); 
+0

Cảm ơn! Tôi sẽ chấp nhận câu trả lời của bạn sau 10 phút. –

+0

'rewind (fp)' có lẽ tốt hơn, vì nó cũng có hiệu lực (đối với các tệp được mở để cập nhật) chuẩn bị cho việc chuyển đổi giữa đọc và viết. – Peter

+0

@Peter - Cảm ơn, tôi đã cập nhật câu trả lời. –

Các vấn đề liên quan