01/10/2018, 16:17

Đọc từng dòng trong file nhưng bị lỗi độ dài trong C?

Code chương trình của mình như sau:
Đọc từng dòng trong file sau đó in ra màn hình từ và độ dài của chúng. ( file data.txt là file bao gồm các từ tiếng anh mỗi từ một dòng)

Nhưng lỗi ở đây là khi mình trả về độ dài của chúng thì độ dài luôn lớn hơn 1 so với thực tế
ví dụ như từ là window thì độ dài trả về lại là 7 ???

Ai giúp mình giải thích và sửa lỗi với X_X
Mình nghi fgets đọc luôn ký tự và coi đó là 1 ký tự của từ nhưng chưa biết cách sửa lỗi

#include<stdio.h>
#include<string.h>
 #include<stdlib.h>
int main()
{
    FILE * file;
        file= fopen("data.txt","r");
        char* singleLine;
        singleLine = (char *) malloc(150* sizeof(char *));
        if(file){
            while(!feof(file)){
                fgets(singleLine,150, file);
                puts(singleLine);
                printf("length: %ld
",strlen(singleLine));
            }
        }
        fclose(file);
        
        return 0;
    }
Khoa NTA viết 18:30 ngày 01/10/2018

Bạn nghĩ đúng rồi đó bạn. Gõ fgets cppreference là có liền: https://en.cppreference.com/w/c/io/fgets

Reads at most count - 1 characters from the given file stream and stores them in the character array pointed to by str. Parsing stops if end-of-file occurs or a newline character is found, in which case str will contain that newline character. If no errors occur, writes a null character at the position immediately after the last character written to str.

Góp ý, muốn kiểm tra dữ liệu chuỗi có gì, dùng printf("string: \"%s\"\n", singleLine), đặt vào 1 cặp ngoặc thì bạn mới biết chính xác chuỗi có ký tự xuống dòng không. Dòng kiểm tra độ dài siêng mà sao ở trên lười vậy Test có tâm mới tìm được bugs bạn nhé!

Florastamine viết 18:27 ngày 01/10/2018

Bạn Nick cover gần hết rồi, mình chỉ note thêm:

  • Bạn quên free(singleLine);
  • Đọc buffer ngắn thì dùng stack cho nhanh và tiện
char line[150];
if (file)
{
  while (!feof(file))
  {
    fgets(line, 150, file);
    line[strlen(line) - 1] = 0; /* Xóa kí tự \n */
    ...
  }
}
Bài liên quan
0