C 从文件读入2D字符数组
我试图做的是在概念上很简单,但在实践中我不能很好地让它工作 我有一个文件,我正试图从中读取,有3列。第一列和第二列是整数列,而第三列包含字符串 我将这个文件的内容写入一系列数组。我的问题在于字符数组,它是二维的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
#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++;
}
}