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
Vì
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'
.Có phải đó là cặp ký tự CR - LF không anh ?
Đú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.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ùngstd::getline
thì sau khi ghi ra file 1 dòng phảistd::endl
thì nó mới xuống dòng)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 đó)