我想要做的事情在概念上很简单,但我无法让它在实践中发挥作用。
我有一个我想读的文件,有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)
我应该尝试以另一种方式解析文件,还是只是我想念的小东西? 提前致谢。
答案 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;顺便说一句:)