чтение строк файла char by char в массив char ** - PullRequest
0 голосов
/ 12 апреля 2019

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

int main(int argc,char* argv[])
{

        char ** lines;
        readFile(argv[1],lines);

}
int readFile(char* filePath,char** lines)
    {  
    char file_char;
    int letter_in_line=0;
    int line=1;
    char* line_string=malloc(1024);
    int j=1;
    int fd=open(filePath,O_RDONLY);
    if (fd < 0)
    {
            return 0;
    }

     while (read(fd,&file_char,1) >0)
     {
             if(file_char != '\n' && file_char != '0x0')
             {
                line_string[letter_in_line] = file_char;
                letter_in_line++;                   
             }                    

             else
             {
                if(lines != NULL)
                {
                    lines=(char**)realloc(lines,sizeof(char*)*line);
                }
                else
                {
                    lines=(char**)malloc(sizeof(char*));
                }
                char* line_s_copy=strdup(line_string);
                lines[line-1]=line_s_copy;
                line++;
                letter_in_line=0;
                memset(line_string,0,strlen(line_string));

             }
             j++;
     }
     printf("cell 0 : %s",lines[0]);

     return 1;

}

У меня есть 2 вопроса:

  • 1) Всякий раз, когда код достигает отпечатка ячейки 0, я получаю
    Ошибка сегментации (ядро сброшено) ошибка. Что случилось ?
  • 2) Если я хочу увидеть изменения в массиве строк в моем основном, я должен пройти & линии на func и получить символы char *** в качестве аргумента? В
    Кроме того, мне нужно будет заменить каждое ключевое слово 'line' на '* line'? * Я знаю, что могу использовать fopen, fget и т. Д. Я решил по какой-то причине реализовать его таким образом.

1 Ответ

1 голос
/ 13 апреля 2019

Существует много проблем, из-за которых создается дамп ядра кода. Здесь версия очень похожа на ваш код. Я надеюсь, что это поможет вам понять это.

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>

int read_file(const char *filename, char ***result)
{

     /* open the file */
     const int fd = open(filename, O_RDONLY);
     if (fd < 0) {
      *result = NULL;
      return -1;
     }
     /* read the file characters by characters */
     char *buffer = (char *)malloc(sizeof(char) * 1024); 
     char c; 
     int column = 0; 
     int line = 0;
     *result = NULL; 

     /* for each characters in the file */
     while (read(fd, &c, 1) > 0) {
      /* check for end of line */
      if (c != '\n' && c != 0 && column < 1024 - 1) 
           buffer[column++] = c;
      else {
           /* string are null terminated in C */
           buffer[column] = 0;
           column = 0; 

           /* alloc memory for this line in result */
           *result = (char **)realloc(*result, sizeof(char *) *
                      (line + 1));

           /* duplicate buffer and store it in result */
           (*result)[line++] = strdup(buffer);
      }
     }
     free(buffer); 
     return line; 
}

int main(int argc, char *argv[])
{
     if (argc != 2) {
      fprintf(stderr, "usage: %s [filename]", argv[0]);
      return 1; 
     }

     char **lines; 
     int line_count = read_file(argv[1], &lines);
     if (line_count < 0) {
      fprintf(stderr, "cannot open file %s\n", argv[1]);
      return 1; 
     }

     for(int i=0; i < line_count; i++)
      printf("%s\n", lines[i]);

     return 0; 
}

Здесь другая версия:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int read_file(const char *filename, char ***result)
{
     /* init result */
     *result = NULL;

     /* open the file */
     FILE *file = fopen(filename, "r");
     if (file == NULL)
      return -1;

     /* read the file line by line */
     char *buffer = (char *)malloc(sizeof(char) * 1024);
     int line = 0; 
     while (fgets(buffer, 1024, file)) {
      *result = (char **)realloc(*result, sizeof(char *) *
                     (line + 1));
      (*result)[line++] = strdup(buffer); 
     }
     free(buffer);
     return line; 
}

int main(int argc, char *argv[])
{
     if (argc != 2) {
      fprintf(stderr, "usage: %s [filename]", argv[0]);
      return 1; 
     }

     char **lines; 
     int line_count = read_file(argv[1], &lines);
     if (line_count < 0) {
      fprintf(stderr, "cannot open file %s\n", argv[1]);
      return 1; 
     }
     for(int i=0; i < line_count; i++)
      printf("%s\n", lines[i]);

     return 0; 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...