Перезаписываю мой массив fgets в C - PullRequest
0 голосов
/ 09 июня 2018

Все в C прямо здесь ...

Я хочу прочитать CSV-файл с fgets отдельно для каждой строки.Я делаю это, просматривая мой CSV-файл, читая определенную строку, сохраняя это в моем массиве и увеличивая мою непрерывную переменную.

Я хочу написать программу для преобразования CSV-файла в JSON со специальными заголовками дляконкретные строки, но это долгий путь ...

Это мой код:

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

int main() {
    printf("\n\n\nCode starts...\n");

   int i = 0;
   int j = 0;

   char content[1000];
   char * contentArray[2][9];

   FILE * regel1 = fopen("Regel-1.csv","r");

   while(!feof(regel1)){
        fgets(content, sizeof(content), regel1);
        contentArray[i][j] = content;
        printf("\nThis is contentArray[%i][0]: %s\n", i, contentArray[i][0]);
        i++;
   }

   printf("\nWhile-Loop finished...\n");

   for(int n = 0; n<=1; n++){
       printf("\nThat is contentArray[%i][0]: %s\n", n, contentArray[n][0]);
   }

   fclose(regel1);
     return 0;
}

Как вы можете видеть в моем выводе, он сначала сохраняет две разные строкиCSV-файл в массив, но затем ... как я знаю из тестирования ... перезаписывает первую запись массива с Fgets ...

Код начинается ...

Это contentArray [0] [0]: ME ; Wie is der der ugliche Abstand der gegnerischen Spieler bei einer mit dem Fuß ausgeführten Spielfortsetzung, zB dem Anstoß?; 9 метров; 9,15 метра; 10 метров;2; 2 ;;;

Это contentArray [1] [0]: ME ; Welche Art von Freistoß wird einem believebigen Punkt innerhalb des Torraums ausgeführt?; Direkte und Indirekte Freistöße fürdie verteidigende Mannschaft.; Direkte Freistöße für die angreifende Mannschaft.; Indirekte Freistöße für die angreifende Mannschaft.; 1; 2 ;;;

Пока цикл завершен ...

То есть contentArray [0] [0]: ME ; Welche Art von Freistoß wird a einem faithbigen Punkt innerhalb des Torraums ausgeführt?; Direkte und Indirekte Freistöße für die verteidigende Mannschaft.;;

То есть contentArray [1] [0]: ME ; Welche Art von Freistoß wird a einem believebigen Punkt innerhalb des Torraums ausgeführt?; Direkte und Indirekte Freistöße für die verteidigende Mannschaft.; Direkte Freistöße für die angreifende Mannschaft.; Indirekte Freistöße für die angreifende Mannschaft.; 1; 2 ;;;

Буду очень признателен за вашу помощь.

Заранее спасибо

GMOSS

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

Я попробовал ваш второй совет с strdup, он работает, и я понимаю, почему: D

while(!feof(regel1)){
        fgets(content, sizeof(content), regel1);
        char * duplicate = strdup(content);
        contentArray[i][j] = duplicate;
        printf("\nThis is contentArray[%i][0]: %s\n", i, contentArray[i][0]);
        i++;
        free(duplicate);
   }

Я хотел бы также понять версию с трехмерным массивом вместо двумерного массива.Буду признателен, если вы объясните это немного более подробно.

Заранее спасибо!

GMOSS

0 голосов
/ 10 июня 2018

@ mentallurg Я сделал это с помощью strcpy, поэтому мой указатель не меняется при последнем изменении содержимого:

   int i = 0;
   int csvlength = 0;

   char content[1000];
   char linesArray[maxlength][1000];

   while(!feof(file)){
        fgets(content, sizeof(content), file); //Zeilenweise als String extrahieren
        strcpy(linesArray[i], content); //Kopieren des Strings in das linesArray
        csvlength = max_int(csvlength, i); //Zählen der Anzahl der Zeilen
        i++;
   }
0 голосов
/ 09 июня 2018

На самом деле у вас есть две проблемы.

Первая спрашивается о и почему на нее отвечают, почему «while (! Feof (file))» всегда неверно? .

Вторая проблема, о которой вы спрашиваете, состоит в том, что у вас есть матрица указателей.И все указатели, которые вы инициализируете, будут все указывать на одно и то же место : первый символ в массиве content.

Чтобы решить вашу проблему, либо наберите contentArray массив массивов массивов и скопировать строку из contents.Или используйте общедоступную функцию strdup для дублирования строки.

Если вы используете strdup, не забудьте использовать free, чтобы освободить память strdup выделяет.


Есть и другие вещи, которые вы могли бы улучшить, но они не повлияют на ваши текущие проблемы.Например обработка ошибок.Что произойдет, если вам не удастся открыть файл и fopen вернет нулевой указатель?Вы должны справиться с этим и не продолжать, так как это приведет к неопределенному поведению .

...