Чтение из файла в двумерный массив

То, что я пытаюсь сделать, просто в концепции, но я не могу заставить ее работать на практике.

У меня есть файл, который я пытаюсь прочитать, есть 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, и он отлично работает на обеих частях, без & кстати...

Другие вопросы по тегам