read пытается прочитать до LUNG_BUF байтов в буфер и возвращает количество фактически прочитанных байтов (или ноль в случае конца файла или -1, чтобы указать на ошибку).
Это означает, что проверка для == 1
в большинстве случаев будет неудачной.
Если вы хотите интерпретировать данные, также имеет смысл прочитать на один байт меньше максимального размера буфера, чтобы иметь возможность поместить завершающий NUL-байт в конец буфера.
Вы Затем можно оценить эти данные, например, используя указатель, который устанавливается в начало буфера при каждом проходе l oop.
Таким образом, ваш код будет выглядеть следующим образом:
size_t n;
while ((n = read(fileno(file), buffer, LUNG_BUF - 1)) > 0) {
buffer[n] = '\0';
char *ptr = buffer;
while (*ptr) {
bytes++;
if (*ptr == ' ' || *ptr == '\t') {
state = WHITESPACE;
} else if (*ptr == '\n') {
newLine++;
state = WHITESPACE;
} else {
if (state == WHITESPACE) {
words++;
}
state = WORD;
}
ptr++;
}
}
Другой вариант - использовать fgets, которые предоставляют данные одной строки или до 4095 байтов (так как по крайней мере один завершающий NUL к байту добавляется fgets), если строка на самом деле длиннее.
Таким образом, ваш слегка измененный l oop будет выглядеть так:
while (fgets(buffer, sizeof(buffer), file)) {
char *ptr = buffer;
while (*ptr) {
...