这里的所有东西都在这里......
我想读一个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
答案 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++;
}