Чтение из файла в двумерный массив
То, что я пытаюсь сделать, просто в концепции, но я не могу заставить ее работать на практике.
У меня есть файл, который я пытаюсь прочитать, есть 3 столбца. Первый и второй являются целочисленными столбцами, а третий содержит строку.
Я беру содержимое этого файла и записываю их в серию массивов. Моя проблема заключается в массиве символов, который является двухмерным.
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#define NUMBER 128 //Maxmimum number of items/lines in file.
#define BUFFER 120 //Buffer length.
#define LENGTH 32 //Maximum length of lines in file.
//------------------------Global Variables. ---------------------------------------------
int iterations=0; //Will count number of times the calculation function is called.
int weight[NUMBER];
int value[NUMBER];
char object[NUMBER][LENGTH];
//------------------------Main. ---------------------------------------------------------
int main(void)
{
FILE *fp; //File pointer.
char buffer[120]; //Temporary storage
int result;
int i,j=0;
int weight[NUMBER];
int value[NUMBER];
char object[NUMBER][LENGTH];
fp=fopen("knapsack.data","r");
if(NULL==fp){
printf("Error opening file. \n");
exit(0);
}
//Print the file.
printf("Weight \t Value \t Object \n");
for(i=0;i<=NUMBER;i++){
while(NULL != fgets(buffer, 120, fp)){
result=sscanf(buffer, "%d %d %s", &weight[i], &value[i], object[i][0]);
printf("%d \t %d \t %s \n", weight[i], value[i], object[i][0]);
}
}
for(j=0;j<4;j++){
printf(" String i equals %s \n", object[j]);
}
fclose(fp);
}
Проблема, с которой я сталкиваюсь, заключается в том, что при печати я обнаружил, что содержимое столбца строк (ноль) выглядит так:
Weight Value Object
1 10 (null)
2 25 (null)
5 40 (null)
7 100 (null)
Должен ли я пытаться разобрать файл другим способом, или это просто что-то маленькое, что мне не хватает? Заранее спасибо.
2 ответа
Тебе нужен амперсанд &object[i][0]
в обоих sscanf
а также printf
, Кроме того, компилятор может жаловаться на ошибку типа, в этом случае вам также необходимо привести: (char *)&object[i][0]
Используйте &object[i][0] или object[i] (они могут использоваться взаимозаменяемо, они означают одно и то же для строк c)
Что касается вашего вывода и того, почему он не печатается успешно, то это связано с тем, как вы читаете данные из файла. Вы используете цикл while, когда вы должны использовать оператор if внутри цикла while, чтобы проверить, сколько итераций достигло ЧИСЛА раз. Примерно так должно работать:
i = 0;
while(NULL != fgets(buffer, 120, fp))
{
if(i < NUMBER)
{
result = sscanf(buffer, "%d %d %s", &weight[i], &value[i], object[i]);
printf("%d \t %d \t %s \n", weight[i], value[i], object[i]);
i++;
}
}
Я проверил это с вашим кодом и образцом созданного мной файла knapsack.data, и он отлично работает на обеих частях, без & кстати...