Vấn đề về dùng r+ khi mở file

mọi người cho mình tại sao khi mình tạo 1 file là tung.txt với nội dung là abcxyz (mình tạo bằng cách bấm chuột phải xong bấm new text document, chứ không phải dùng code để tạo ) xong rồi mình vào viết code như sau

int main (int argc, char *argv[ ])
 {
    FILE *taptin=NULL;
    taptin=fopen("tung.txt","r+");
    if (taptin == NULL) {
        printf("khong mo duoc");
        fclose(taptin);
        return 1;
    }
    fputc('o',taptin);
    char kyTu=0;
    kyTu = fgetc(taptin);
    printf("%c", kyTu);
    fclose(taptin);
    return 0;
}

thì kết quả mình không in được gì hết
image
và mình mở lại file mình đã làm việc thì file đấy lại bị thế này
image
cảm ơn mn ạ

em thử in ra printf("%d", (int)kyTu); xem nó in ra số mấy

có thể khi tạo new text document ông windows dở chứng tạo utf-8 with bom hay gì đó :V

5 Likes

ra số 0 ạ, với lại 1 điều lạ kì nữa là khi mà lần đầu tiên dùng code để thay đổi nội dung thì nó sẽ không thay đổi chữ cái đầu tiên mà thay vào đó sẽ chèn thêm chữ cái vào image
(nội dung ban đầu là abcxyz ).
Nhưng từ lần thứ 2 trở đi thì sẽ thay đổi chữ cái đầu tiên như bình thường ạ

ra số 0 vậy là chưa ghi ký tự ‘o’ xuống file rồi

em gọi thêm fflush(taptin); cho nó ghi hết xuống :V

    fputc('o',taptin);

    fflush(taptin);

    char kyTu=0;
    kyTu = fgetc(taptin);
    printf("%c", kyTu);

còn điều kỳ lạ kia thì em thử mở file read-only "r" rồi đọc in ra từng ký tự xem nó in ra gì:

taptin = fopen("tung.txt","r");
int charCode = 0;
while ((charCode = fgetc(taptin)) != EOF))
    printf("%d ", charCode);
3 Likes

mà sao nó lại chưa ghi ‘o’ là sao ạ :v

vì ghi xuống đĩa cứng rất chậm, nên thay vì ghi từng ký tự xuống đĩa cứng, nó ghi vào 1 vùng nhớ tạm gọi là vùng đệm (buffer) trên ram (nhanh hơn vài trăm vài ngàn lần gì đấy :V), rồi đợi khi đầy buffer mới ghi xuống đĩa cứng 1 lượt. Có thể kích thước buffer là 4096 bytes, đợi ghi đủ 4096 bytes vào buffer nó mới ghi xuống đĩa cứng :V

4 Likes

vậy hàm fflush() là để ghi luôn vào đĩa cứng ạ?

đúng rồi đó em, fflush là đẩy hết nội dung từ buffer xuống file :V

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

coi cái example người ta cũng mở file “r+”, cũng phải fflush rồi mới đọc

4 Likes

ok ạ. Với lại e thử làm theo a bảo về cái vấn đề điều kì lạ thì e thấy máy nó trả về các số bình thường mà
image
97 98 99 120 121 122 là abcxyz mà, làm gì có kí tự nào trước kí tự a đâu ạ?

lạ vậy :V code của em cũng y như code post 1 à? Thử thêm fflush xem :V

Chèn thêm chữ cái mới kì lạ :V

e tạo 1 file mới với nội dung abcxyz rồi e chỉ code như a bảo

 {
    FILE *taptin=NULL;
    taptin = fopen("tung.txt","r");
int charCode = 0;
while ((charCode = fgetc(taptin)) != EOF)
    printf("%d ", charCode);
}

thì k có vấn đề gì mà

em thử ghi chữ o, flush nó, rồi đọc o lại, rồi mở file xem nó chèn hay ghi đè

3 Likes

ok nó ghi đè rồi ạ :v

hỏi có cách nào chèn vô ở đầu file ko nè. Toàn trả lời là ko thể nào (trừ phi đọc hết nội dung file rồi ghi lại sau nội dung cần chèn) vậy mà em làm được mới kinh dị :V :V

3 Likes

:v a cứ thử làm như cái đoạn code đầu tiên của em xem :v

nó ra

o硣穹

@_@

mở bằng notepad++ thì nó in ra
image
bằng cách nào đó nó in luôn ký tự 0 xuống cùng với o khi close file :V

:v =)) tùy lần thôi a có lần nó k bị mấy chữ linh tinh ấy mà, e thử nhiều lần rồi e biết :v

chắc là undefined behavior, ko biết :V

3 Likes

image
mặc dùng thêm fflush nhưng vẫn có lúc bị in ra thế này nè. xong vào file thì nó cũng thành mấy kí tự linh tinh @@ :v nhưng mà sau bao nhiêu lần thì e mới bị 1 lần thế này :v còn các lần là ok đúng quy trình -_-

lạ vậy, anh chạy lần nào cũng ra chữ b mà :V

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