从文件读取到2D char数组

时间:2014-03-03 21:46:00

标签: c arrays file scanf

我想要做的事情在概念上很简单,但我无法让它在实践中发挥作用。

我有一个我想读的文件,有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);
}

我遇到的问题是,在打印时,我发现字符串列的内容是(null),如下所示:

Weight   Value   Object
1        10      (null)
2        25      (null)
5        40      (null)
7        100     (null)

我应该尝试以另一种方式解析文件,还是只是我想念的小东西? 提前致谢。

2 个答案:

答案 0 :(得分:2)

&object[i][0]sscanf都需要&符号printf。此外,编译器可能会抱怨类型错误,在这种情况下,您还需要强制转换:(char *)&object[i][0]

答案 1 :(得分:1)

使用&amp; object [i] [0]或object [i](它们可以互换使用,它们与c字符串的含义相同)

就您的输出及其无法成功打印的原因而言,它与您从文件中读取数据的方式有关。当您在while循环中使用if语句检查迭代次数达到NUMBER次时,您正在使用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文件对此进行了测试,它在两个部分都运行良好,没有&amp;顺便说一句:)