2014-03-03 42 views
1

我想要做的是概念上很简单,但我不能完全得到它在实践中的工作。从文件读取到二维字符数组

我有一个文件,我试图读取,有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

您需要在sscanfprintf之间的和号&object[i][0]。此外,编译器可能会抱怨类型错误,在这种情况下,您还需要投射:(char *)&object[i][0]

+0

工作在两个部分就好了,没有&这适用于第一个printf(在while循环中),谢谢。 :)但是,当程序落空至第二份声明,我不知道会发生什么,但输出是: '''重量值对象 110鼠标 2 25手机 5 40平板 7 100笔记本 字符串i等于笔记本 字符串i等于 字符串i等于 字符串i等于 ''' – alldavidsluck

+1

是的,这是相同的。使用'&object [j] [0]'。如果长度大于31的字符串会导致字符串相互溢出,那么可能还存在问题。 –

+0

必须是其他东西,字符串的长度不是20。谢谢你的帮助!被选为最佳答案。 – alldavidsluck

1

要么使用& 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文件测试了这一点,它的方式:)

+2

i = 0;事实上,这里是关键。我打算有两行,int i,j;并且i = j = 0;但我不小心将它们组合在一起。 是的,对象上的sscanf可以使用或不使用&和[0],我只是更喜欢指定在两个维度中开始的位置。非常感谢您投入此时间。 :) – alldavidsluck

相关问题