мой вопрос о функции get_next_line, я должен прочитать файл и использовать несколько размеров буфера - PullRequest
1 голос
/ 08 июля 2019

моя функция читает символ за символом, поэтому он не работает с несколькими размерами буфера, и мне нужна помощь в его исправлении, чтобы он мог работать с любым размером буфера, а не только 1.

, поэтомуОсновная проблема заключается в том, что он должен работать с размером буфера, а не символ за символом

Я пытался прочитать, изменяя буфер, но он пропускает некоторые символы

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#define BUFF_SIZE 32
#include <string.h>
#include <ctype.h>
#include <stdbool.h>

int get_next_line(int fd, char **line){

    static char * s_line = NULL;
    static int s_max = 0;
        char character[BUFF_SIZE + 1];

    if(s_line == NULL)
    {
        s_line = (char *)malloc((BUFF_SIZE + 1) * sizeof(char));
        s_max = BUFF_SIZE;
    }
    int len = 0;
    int ret;

    while ((ret = read(fd, character, BUFF_SIZE)) > 0)
    {
        if (character[0] == '\n'){
            break;
        }
        s_line[len] = character[0];
        len = len + 1;
        if (len >= s_max)
        {
            char *tmp;
            s_max = s_max + BUFF_SIZE;
            tmp = (char *) malloc((s_max + 1) * sizeof(char));
            s_line[len] = '\0';
            strcpy(tmp, s_line);
            free(s_line);
            s_line = tmp;
        }
    }
    if (ret < 0) { //read error, free memory and return -1
        free(s_line);
        return -1;
    }
    if (len == 0){
        free(s_line);   //required to release the memory after reading the entire file
        s_line = NULL;
        return 0;
    }
    s_line[len] = '\0';
    *line = s_line;
    return 1;
}
int main(int argc, char **argv)
{
    char *txt;
    int fd;

    fd = open(argv[1], O_RDONLY);
    while (get_next_line(fd, &txt) > 0)
    {
        printf("%s\n", txt);
    }
    printf("Done\n");
    if (txt != NULL)
    {
        free(txt);
    }
    return (0);
}

Я ожидаю вывод чтения всегофайл, не пропуская символы, как то, что он делает

1 Ответ

1 голос
/ 08 июля 2019

Символ читает строку размера BUFF_SIZE.Поэтому вам нужно перебрать каждый элемент в строке, если BUFF_SIZE> 1, и скопировать его в массив s_line, чтобы скопировать всю строку.В противном случае символы будут пропущены.

while ((ret = read(fd, character, BUFF_SIZE)) > 0)
{
  for(i=0;i<BUFF_SIZE;i++){ // for loop is added to visit every element of the character array
    if (character[i] == '\n'){
    s_line[len] = '\n';
    break;
    }
    s_line[len] = character[i];
    len = len + 1;
    if (len >= s_max)
    {
        char *tmp;
        s_max = s_max + BUFF_SIZE;
        tmp = (char *) malloc((s_max + 1) * sizeof(char));
        s_line[len] = '\0';
        strcpy(tmp, s_line);
        free(s_line);
        s_line = tmp;
    }
}}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...