Я пытаюсь сохранить данные csv в массиве для использования в других функциях. Я понимаю, что strdup хорош для этого, но я не уверен, как заставить его работать для моей ситуации. Любая помощь приветствуется!Как преобразовать мой malloc + strcpy в strdup в C?
Данные хранятся в структуры:
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. –
Похоже, что вы хотите открыть файл, содержащий строки текста, в этом случае текст разделенных запятыми значений и прочитать каждую строку в массиве строковых буферов, где каждый элемент массива указывает на выделенную область памяти, содержащую текстовая строка. Результатом должен быть массив указателей на строки, где порядок строк совпадает с порядком строк в файле. Поэтому массив [0] должен указывать на буфер, содержащий текст первой строки текста в файле. Это то, что вы хотите сделать? –
На первый взгляд 'strdup' не ваша проблема; ваша настоящая проблема - исчерпывающее распределение. Например, вы дважды передаете файл и считаете символы новой строки в первом проходе. Это нормально, но почему вы выделяете перед этим проходом, когда вы не знаете, сколько выделить? –