Стрлен проблем, возвращает правильную длину + 2 - PullRequest
0 голосов
/ 15 ноября 2018

У меня странная ошибка.

Я написал функцию, которая получает файл и возвращает длину каждой строки:

void readFile1(char *argv[], int fileNumber,
          char *array_of_lines[NUMBER_OF_LINES+1], int *currNumOfLines)
{
    FILE* fp;
    fp = fopen(argv[fileNumber], "r");
    if (fp == NULL)
    {
        fprintf(stderr, MSG_ERROR_OPEN_FILE, argv[fileNumber]);
        exit(EXIT_FAILURE);
    }
    char line[256];
    while (fgets(line, sizeof(line), fp))
    {
        printf("\n line contains : %s size is : %lu\n",line,strlen(line));
    }
}

Функция всегда печатает правильное число + 2 , Например, если file.txt содержит только одну строку с "AAAAA", функция выведет, что длина равна 7 вместо 5,

 line contains : AAAAA
 size is : 7

Кто-нибудь знает, где ошибка?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018
printf("\n line contains : %s size is : %lu\n",line,strlen(line));

Вот дешевая распродажа

Полученный результат

line contains : AAAAA
size is : 7

Ожидаемый результат

line contains : AAAAA size is : 7
0 голосов
/ 15 ноября 2018

Не забывайте, что fgets оставляет новую строку в буфере.

Кажется, вы читаете файл, созданный в Windows (где символ новой строки - два символа "\r\n") в системе, где символ новой строки - только "\n". Эти два символа также являются частью строки и будут учитываться как strlen.


Причина, по которой я предполагаю, что вы читаете созданный Windows файл в системе, отличной от Windows, заключается в том, что для файлов, открытых в текстовом режиме (по умолчанию), функции чтения и записи строк будут переводить переводы строк в зависимости от формата операционной системы.

Например, в Windows, при написании простого "\n" оно будет переведено и фактически будет записано как "\r\n". При чтении происходит обратный перевод ("\r\n" становится "\n").

В системе с простыми "\n" окончаниями строк (например, Linux или macOS) перевод не требуется, и часть "\r" будет обрабатываться как любой другой символ.

...