Hỏi về dấu nháy khi đọc, viết file trong C

Mọi người giúp em chút kiến thức về việc đọc, ghi file trong C được không ạ?
Giả sử có 1 file (.txt chẳng hạn) chứa ký tự (ngoài EOF).
abc
defgh

  1. Vị trí của ký tự đầu tiên (tức là ‘a’) trong file là 0 hay 1 ạ?
  2. khi hàm fopen() chạy lần đầu thì dấu nháy ảo có đặt vào ‘a’ không ạ? Nếu không thì đặt vào đâu ạ?
  3. khi gọi hàm rewind() thì dấu nháy có đặt vào ‘a’ không ạ? Nếu không thì đặt vào đâu ạ?
  4. Việc thực hiện đọc/ghi xảy ra theo quy tắc nào trong 2 quy tắc sau ạ?:
    4.1 đọc/ghi ở vị trí dấu nháy hiện tại rồi ngay lập tức nhảy tới vị trí tiếp theo để chờ lệnh
    4.2 nhảy tới vị trí tiếp theo rồi mới thực hiện đọc/ghi
  5. Khi viết chương trình in nội dung file ra màn hình, tại sao sau ký từ ‘h’ lại xuống dòng rồi mới tới EOF ạ? ở đoạn dưới em viết ký tự ‘?’ thay cho EOF ạ!
    abc
    defgh
    ?
1 Like

EOF không phải là một kí tự. Nó chỉ là một trạng thái của quá trình đọc tập tin.

  1. Vị trí đầu tiên là 0.
  2. Không đặt vào a. Nó đặt vào trước a.
  3. Như trên thôi. Xem như đọc lại từ đầu.
  4. Đọc trong khi “nhảy” qua kí tự đó.
  5. Câu lệnh in của bạn đâu? Có thể kí tự xuống dòng là từ lệnh in mà ra.

Khi giá trị của con trỏ bằng với độ lớn của tập tin thì trạng thái sẽ trở thành EOF.

5 Likes

:grinning: em cảm ơn nhiều ạ!

anh có thể giải thích thêm giúp em về chỗ này được không ạ? giả sử dấu nháy đang ở ký tự ‘a’, khi gọi hàm fgetc() thì chuyện gì xảy ra ạ?

đây là đoạn code mà em thực hiện và kết quả ạ:

int main()
{
    char c = 0;
    FILE *file = NULL;
    file = fopen("text.txt", "r");
    if (file != NULL)
    {
        while ((c = fgetc(file)) != EOF)
            printf("%c", c);
        printf("%c", fgetc(file));
        fclose(file);
    }
}
there is no newline character at the end of this line.
there is no newline character at the end of this line.
�
Process returned 0 (0x0)   execution time: 0.002 s
1 Like

Kí tự hiển thị của EOF vì thực sự thì EOF có giá trị là -1 (xem EOF).
Lưu ý là không có kí tự nào có giá trị âm. Khi một giá trị không hợp lệ bị ép hiển thị dạng kí tự thì nó sẽ được thay thế bằng .
Còn về kí tự xuống dòng được thể hiện, mình chưa rõ lý do.
Bạn hãy thử thêm nhiều dòng printf("%c", fgetc(file)); nữa xem nó in ra những gì.


printf("%c", -99);

Kết quả:

4 Likes

em đã thêm 2 dòng printf() nữa rồi ạ! Kết quả đây ạ!
image
image

1 Like

Quên mất!
Biểu diễn cho bạn xem thế này:
fopen():

 a b c d e f 
^

fgetc() => a:

 a b c d e f 
 ^
=> a

 a b c d e f 
  ^

fgetc() => b:

 a b c d e f 
   ^
=> b

 a b c d e f 
    ^

Bó tay. Không hiểu kí tự xuống dòng từ đâu ra. Cũng có thể màn hình Console hết độ rộng nên nó rớt xuống. :thinking:

5 Likes

:star_struck: em cảm ơn ạ!!!

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