C 从文件读入2D字符数组

C 从文件读入2D字符数组,c,arrays,file,scanf,C,Arrays,File,Scanf,我试图做的是在概念上很简单,但在实践中我不能很好地让它工作 我有一个文件,我正试图从中读取,有3列。第一列和第二列是整数列,而第三列包含字符串 我将这个文件的内容写入一系列数组。我的问题在于字符数组,它是二维的 #include <stdio.h> #include <stdlib.h> #include <strings.h> #define NUMBER 128 //Maxmimum number of items/lines in file. #de

我试图做的是在概念上很简单,但在实践中我不能很好地让它工作

我有一个文件,我正试图从中读取,有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);
}
我应该试着用另一种方式解析这个文件,还是只是缺少了一些小东西?
提前谢谢

sscanf
printf
中都需要一个与
&object[i][0]
。此外,编译器可能会抱怨类型错误,在这种情况下,您还需要强制转换:
(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++;
    }
}
i=0;
while(NULL!=fgets(缓冲区,120,fp))
{
如果(i

我用您的代码和我创建的示例knapsack.data文件对此进行了测试,它在这两个部分都可以正常工作,没有第一个printf(在while循环中)的&顺便说一下:)

,谢谢。:)但是当程序进入第二个语句时,我不确定会发生什么,但输出是:``权重值对象1 10鼠标2 25手机5 40平板电脑7 100笔记本电脑字符串I等于笔记本电脑字符串I等于字符串I等于字符串I等于字符串I等于``是的,是一样的。使用
对象[j][0]
。如果字符串的长度大于31,则可能仍然存在问题,这将导致字符串相互溢出。那么肯定是其他原因,字符串长度甚至不到20。好吧。谢谢你的帮助!被选为最佳答案。i=0;事实上,这是关键。我的意思是有两行,inti,j;i=j=0;但我不小心把它们结合起来了。是的,对象上的sscanf可以使用&和[0],也可以不使用&和[0],我只是更喜欢在两个维度中指定开始的位置。非常感谢您为此投入的时间。:)
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++;
    }
}