将逗号分隔的文本文件读取到C中的2D数组中

时间:2018-04-05 15:42:04

标签: c arrays multidimensional-array

我正在尝试将一个包含5000个名称的文件读入C中的二维数组中,其格式如下:

"MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","MARIA","SUSAN","MARGARET"

此刻,它只是给了我"分段错误:11"。我试图在每个名称中读取它自己的2D数组,但我无法弄清楚如何做到这一点。到目前为止,这是我的代码:

//initialise array and chars
char names[5000][10] = {""};
int i;
char separator = ',';
char ch;

//open file
FILE *namesToBeSorted;
namesToBeSorted = fopen(argv[1], "r");
int j = 0;

//find file size
fseek(namesToBeSorted, 0L, SEEK_END);
int fileSize = ftell(namesToBeSorted);
rewind(namesToBeSorted);

//read from file into array
for (i = 0; i < fileSize; i++){
    fscanf(namesToBeSorted, "%c", &ch);
    while(ch != separator)
        names[i][j] = ch;
        fscanf(namesToBeSorted, "%c", &ch);
        j++;
}

//print array
for (i = 0; i<5; i++){
    for(j = 0; j < 10; j++){
        printf("%c\n", names[i][j]);
    }
}

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我会尝试通过评论和我自己的一些意见来总结这些问题......

names中的每个字段都需要比最长名称长一个字符。如果您事先知道最大尺寸,只需硬编码即可。否则,您需要确保读取的字符数不超过插入字符串的缓冲区。让我们把它留给另一个问题;硬代码很大(例如128代替10),稍后进行优化。

您缺少尖括号以限定while(ch!=separator)的正文范围。 C与缩写与作用域相同的Python不同。

scanf可用于提取字符串的一部分。不需要自己迭代每个角色。不确定这是否有效但它应该跳过一个字符("),然后提取字符直到出现",跳过,,然后重复直到所有名称都被提取出来:< / p>

while(fscanf(namesToBeSorted, "\"%s\",", names[i++])); // terminates when fscanf fails to extract a name, see fscanf doc about its return value
i--; // adjusting counter. hacky hacky

scanf是你的朋友。使用此解决方案,不需要fileSize

打印字符串而不是字符。否则,您将打印未设置为短于最大值的字符的字符。另外,如果打印单个字符串并自动想要换行,最好使用puts

while(i--) puts(names[i]);