Попытка отсканировать строки файла в рваный массив (массив указателей) в C - PullRequest
1 голос
/ 16 мая 2011

запуск UNIX через putty и использование vi и gcc.Я пытаюсь прочитать в строке файла и с помощью рваного массива сохранить строки.Я не буду предоставлять весь код, потому что он не нужен,

main(){
   char func[51];
   char * functions[201];
   FILE * inf;
   if (( inf = fopen("test.txt", "r")) == NULL){
       printf("can't open so exiting\n");
       exit(EXIT_SUCCESS)


   int i;
   i = 0;
   while( fscanf(inf, "%s", func) != EOF){
        functions[i] = func;
        i++;
   }
   printf("%s\n", *functions); /* this is just for me to check if its working*/

   }

, включая stdio.h, stdlib.h и string.h

, поэтому код работает так, что он проходит черезфайл и во время цикла while он сохраняет строку, но я хочу, чтобы функции [0] сохраняли указатель, ведущий к первой строке, а функции [1] сохраняли указатель, ведущий ко второй строке, и так далее.Я не уверен, как это сделать, любая помощь будет оценена спасибо:)

Ответы [ 3 ]

2 голосов
/ 16 мая 2011

Ваша проблема в том, что вы повторно используете массив func - все functions[i] указывают на одно и то же место и, следовательно, будут содержать одну и ту же строку (последнюю, которую вы прочитали). Вам нужно будет выделить достаточно памяти для всех ваших различных строк.

Посмотрите на этот похожий вопрос.

2 голосов
/ 16 мая 2011

Вам необходимо присвоить копию из func для functions[i], как в functions[i] = strdup(func), если у вас есть strdup.

0 голосов
/ 17 мая 2011

Пожалуйста, исправьте ваши блоки форматирования / кода, теперь кажется, что вы читаете test.txt, когда вам не удалось открыть файл и выйти из программы.

Вы должны иметь в виду, что переменная func указывает на структуру данных func[51] сейчас, когда вы fscanf перезаписываете func[51] все время новой строкой. И так как вы храните адрес, указывающий на func[51] в массиве functions, вы фактически не сохраняете содержимое массива char (func[51]).

Вы можете решить эту проблему, сделав массив функций двумерным массивом char functions[201][51], а затем используйте strcpy для копирования структуры данных func указывает на functions[i] с strcpy(functions[i], func);

это приведет к чему-то вроде:

main() {
    char func[51];
    char functions[201][51];
    FILE * inf;
    if (( inf = fopen("test.txt", "r")) == NULL) {
        printf("can't open so exiting\n");
        exit(EXIT_SUCCESS)
    } // <-- you are missing this one

    int i = 0;
    while( fscanf(inf, "%s", func) != EOF){
        strcpy(functions[i++], func);
    }
    printf("%s\n", *functions); /* this is just for me to check if its working*/
}

Это также может быть:

while (fscanf(inf, "%s", functions[i++]) != EOF);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...