用C

时间:2018-06-09 09:28:32

标签: c arrays file csv fgets

这里的所有东西都在这里......

我想读一个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覆盖第一个数组条目... < / p>

  

代码开始......

     

这是contentArray [0] [0]: ME ; Wie istderüblicheAbstandder   gegnerischen Spieler bei einer mitdemFußausgeführten   Spielfortsetzung,z.B。 demAnstoß?; 9米; 9,15米; 10米; 2; 2 ;;;

     

这是contentArray [1] [0]: ME ; Welche ArtvonFreistoßWirdan einem   believebigen Punkt innerhalb desTorraumsausgeführt?; Direkte und   IndirekteFreistößefürdieverteidigende Mannschaft .; Direkte   Freistößefürdieangreifende Mannschaft .;IndirekteFreistößefürdie   angreifende Mannschaft .; 1; 2 ;;;

     

While-Loop完成......

     

这就是contentArray [0] [0]: ME ; Welche ArtvonFreistoßwinean einem   believebigen Punkt innerhalb desTorraumsausgeführt?; Direkte und   IndirekteFreistößefürdieverteidigende Mannschaft .; Direkte   Freistößefürdieangreifende Mannschaft .;IndirekteFreistößefürdie   angreifende Mannschaft .; 1; 2 ;;;

     

这就是contentArray [1] [0]: ME ; Welche ArtvonFreistoßwinean einem   believebigen Punkt innerhalb desTorraumsausgeführt?; Direkte und   IndirekteFreistößefürdieverteidigende Mannschaft .; Direkte   Freistößefürdieangreifende Mannschaft .;IndirekteFreistößefürdie   angreifende Mannschaft .; 1; 2 ;;;

我真的很感谢你的帮助。

提前致谢

GMOSS

3 个答案:

答案 0 :(得分:2)

实际上你有两个问题。

第一个被询问并在Why is “while ( !feof (file) )” always wrong?中回答。

第二个,你问的问题是,你有一个指针矩阵。您初始化的所有指针都将 all 指向指向同一位置:数组content中的第一个字符。

要解决您的问题,请将contentArray数组阵列数组并从contents复制字符串。或者使用常用的strdup函数复制字符串。

如果您使用strdup,请不要忘记使用free释放内存strdup分配。

您还可以改进其他一些事项,但不会影响您当前的问题。例如错误处理。如果您无法打开文件并且fopen返回空指针会发生什么?您需要处理此问题而不是继续,因为这会导致undefined behavior

答案 1 :(得分:0)

我用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

答案 2 :(得分:0)

@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++;
   }