01/10/2018, 08:25

Vì sao các dòng trong file OUTPUT lại cách nhau 1 dòng?

E mới học đến tập tin, thì có viết 1 đoạn code đơn giản sau để in những gì có trong file INPUT.txt sang file OUTPUT.txt

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE *fileIn = fopen("INPUT.txt", "r");
    if (!fileIn) {
        printf("File not found.
");
        return 0;
    }
    FILE *fileOut = fopen("OUTPUT.txt", "w");
    while (!feof(fileIn)) {
        char str[50];
        fgets(str, 50, fileIn);
        fprintf(fileOut, "%s
", str);
    }
    fclose(fileOut);
    fclose(fileIn);
    return 0;
}

Giả sử trong file INPUT.txt có:

Hello world
We don't talk anymore
Lorem ipsum dolor sit amet

thì trong file OUTPUT.txt cũng như vậy.
Nhưng sau khi compile & run đoạn code trên thì trong file OUTPUT.txt, mỗi dòng cách nhau 1 dòng, tức là:

Hello world

We don't talk anymore

Lorem ipsum dolor sit amet

Các pro có thể cho e hỏi vì sao ko ạ ? E nghĩ là do dòng fprintf(fileOut, "%s ", str); có ký tự nhưng nếu có thì nó chỉ xuống 1 dòng thôi chứ sao 2 dòng nhỉ ??
Giúp e vs, cảm ơn các pro

viết 10:29 ngày 01/10/2018

fgets dừng khi gặp kí tự new-line (hoặc end of file), chuỗi sau khi đọc sẽ gồm cả ký tự '\n'.

Long Dragon viết 10:38 ngày 01/10/2018

Có phải đó là cặp ký tự CR - LF không anh ?

viết 10:32 ngày 01/10/2018

Đúng rồi bạn, tổ hợp của CR-LF là biểu diễn của '\n' khi in ra. Bởi vì trong chuỗi str sau khi đọc bằng fgets đã có ký tự '\n' và khi viết ra fileOut trong chuỗi định dạng lại là “%s\n” nên mỗi lần ghi str sẽ có 2 ký tự '\n' được viết ra.

Long Dragon viết 10:41 ngày 01/10/2018

Anh @freedom ơi, em thử dùng std::getline() trong C++ thì nó lại không nhận ký tự \n như fgets là sao ạ? (tức là khi dùng std::getline thì sau khi ghi ra file 1 dòng phải std::endl thì nó mới xuống dòng)

viết 10:40 ngày 01/10/2018

Trong reference của std::getline() có nói mà bạn: http://www.cplusplus.com/reference/string/string/getline/ . Gặp ký tự dừng (delimiter) hàm này sẽ trích ra và loại bỏ (không được lưu trữ trong chuỗi, việc đọc chuỗi kế tiếp sẽ bắt đầu sau ký tự dừng đó)

Bài liên quan
0