c - получить файл в массив символов - PullRequest
1 голос
/ 23 декабря 2009

Привет у меня есть следующий код ниже, где я пытаюсь получить все строки файла в массив ... например, если в файле data.txt у меня есть следующее:

первая строка

вторая строка

тогда в приведенном ниже коде я хочу получить в массив данных следующее: data [0] = "первая строка"; данные [1] = "вторая строка"

Мой первый вопрос: в настоящее время я получаю "Ошибка сегментации" ... Почему?

Именно я получаю следующий вывод:

Количество строк: 7475613

Ошибка сегментации

Мой второй вопрос: есть ли лучший способ сделать то, что я пытаюсь сделать?

Спасибо !!!

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

int main(int argc, char* argv[])
{
 FILE *f = fopen("data.txt", "rb");
 fseek(f, 0, SEEK_END);
 long pos = ftell(f);
 fseek(f, 0, SEEK_SET);

 char *bytes = malloc(pos);
 fread(bytes, pos, 1, f);

 int i =0;
 int counter = 0;
 for(; i<pos; i++)
 {
  if(*(bytes+i)=='\n') counter++;
 }
 printf("\nNumber of lines is %d\n", counter);

 char* data[counter];
 int start=0, end=0;
 counter = 0;
 int length;

 for(i=0; i<pos; i++)
 {
  if(*(bytes+i)=='\n')
  {
   end = i;
   length =end-start;
   data[counter]=(char*)malloc(sizeof(char)*(length));
   strncpy(data[counter],
           bytes+start,
           length);
   counter = counter+1;
   start = end+1;
  }
 }

 free(bytes);
 return 0;
}

Первая строка data.txt в этом случае не '\ n', это: «23454555 6346346 3463463».

Спасибо!

Ответы [ 3 ]

4 голосов
/ 23 декабря 2009
  • Вам нужно malloc еще 1 символ для data[counter] для завершающего NUL.
  • после strncpy необходимо завершить строку назначения.

Редактировать после редактирования исходного вопроса

Количество строк: 7475613

Уххххххххххххххх, это слишком много для твоего компьютера! Если размер char * равен 4, вы хотите зарезервировать 29902452 байта (30М) автоматической памяти при выделении data.

.

Вместо этого вы можете динамически распределять эту память:

/* char *data[counter]; */
char **data = malloc(counter * sizeof *data);

/* don't forget to free the memory when you no longer need it */

Редактировать: второй вопрос

Мой второй вопрос: есть ли лучший способ сделать то, что я пытаюсь сделать?

Не совсем; ты делаешь это правильно. Но, возможно, вы можете кодировать без необходимости хранить все эти данные в памяти одновременно.
Читайте и занимайтесь одной строкой за раз.

Вам также нужно до free(data[counter]); в цикле ... и free(data); до того, как вышеприведенное "вы все делаете правильно" будет правильным:)

И вам нужно , чтобы проверить, успешно ли выполнен каждый из нескольких вызовов malloc() LOL

2 голосов
/ 23 декабря 2009

Прежде всего вам необходимо проверить, правильно ли был открыт файл:

FILE *f = fopen("data.txt", "rb");
if(!f)
{
    fprintf(stderr,"Error opening file");
    exit (1);
}

Если при открытии файла произошла ошибка, и вы не проверили его, вы получите ошибку сегмента при попытке найти неверный указатель файла.

Кроме того, я не вижу ошибок. Попытался запустить программу, напечатав значение массива данных в конце, она запустилась, как и ожидалось.

0 голосов
/ 23 декабря 2009

Следует отметить, что вы открываете свой файл как дисциплины завершения двоичной строки, которые могут работать не так, как вы ожидаете на вашей платформе (UNIX - это lf, Windows - это cr-lf, некоторые версии MacOS - cr).

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