【发布时间】:2014-01-04 18:06:36
【问题描述】:
我正在尝试将 csv 数据保存在一个数组中以供其他函数使用。我知道 strdup 对此有好处,但我不确定如何让它适合我的情况。任何帮助表示赞赏!
数据存储在结构中:
typedef struct current{
char **data;
}CurrentData;
函数调用:
int main(void){
int totalProducts = 0;
CurrentData *AllCurrentData = { '\0' };
FILE *current = fopen("C:\\User\\myfile.csv", "r");
if (current == NULL){
puts("current file data not found");
}
else{
totalProducts = getCurrentData(current, &AllCurrentData);
}
fclose(current);
return 0;
}
我是如何分配内存的;
int getCurrentData(FILE *current, CurrentData **AllCurrentData){
*AllCurrentData = malloc(totalProducts * sizeof(CurrentData));
/*allocate struct data memory*/
while ((next = fgetc(current)) != EOF){
if (next == '\n'){
(*AllCurrentData)[newLineCount].data = malloc(colCount * sizeof(char*));
newLineCount++;
}
}
newLineCount = 0;
rewind(current);
while ((next = fgetc(current)) != EOF && newLineCount <= totalProducts){
if (ch != '\0'){
buffer[i] = ch;
i++;
characterCount++;
}
if (ch == ',' && next != ' ' || ch == '\n' && ch != EOF){
if (i > 0){
buffer[i - 1] = '\0';
}
length = strlen(buffer);
/*(*AllCurrentData)[newLineCount].data[tabCount] = malloc(length + 1); /* originally was using strcpy */
strcpy((*AllCurrentData)[newLineCount].data[tabCount], buffer);
*/
(*AllCurrentData)[newLineCount].data[tabCount] = strdup(buffer); /* something like this? */
i = 0;
tabCount++;
for (j = 0; j < BUFFER_SIZE; j++){
buffer[j] = '\0';
}
}
【问题讨论】:
-
这不是完整的代码。您有几个未声明或设置的变量。无法从这些片段中准确判断代码在做什么。也不清楚 CurrentData 类型应该包含什么。
-
看起来您想要做的是打开一个包含文本行的文件,在本例中为逗号分隔值文本,并将每一行读入字符串缓冲区数组,其中每个数组元素指向到包含文本字符串的已分配内存区域。结果应该是一个指向字符串的指针数组,其中字符串的顺序与文件中行的顺序相同。所以 array[0] 应该指向一个缓冲区,该缓冲区包含文件中第一行文本的文本。这是你想做的吗?
-
乍一看,
strdup不是你的问题;你真正的问题是详尽的分配。例如,您将文件传递两次并计算第一次传递中的换行符。这很好,但是你不知道分配多少,为什么还要在那之前分配呢?