我需要从一个已经存在的文件中扫描3个字符串和一个整数,并将它们分别保存为结构数组中的一个元素。该文件的格式如下:
string1 string2整数string3
string1 string2整数string3
...等等。
在对它们进行fscanfing时,它将正确扫描string1,整数和string3。但是,在扫描string2时,string2似乎总是会产生错误,并且当打印任何string2时,它们要么被剪短,要么带有一些奇特的ASCII符号,例如框中的问号;有时还会触发系统的“铃”声。
我已经测试过通过fscanf为每个不同的字符串收集字符串,这只是第二个混乱的字符串。
我的代码的精简版,突出显示了问题
struct carinfo
{
char name[10];
char make[15];
int number;
char color[10];
}car[4];
filepointer = fopen("file.txt", "r");
while(!feof(filepointer))
{
for(i=0;i<4;i++)
{
fscanf(filepointer, "%s %s %d %s", &car[i].name[10],
&car[i].make[15], &car[i].number, &car[i].color[10]);
printf("%s\n", &car[i].make[15]);
}
}
我的预期结果是第二个字符串将正确扫描,并完整地存储到结构数组中的元素中;取而代之的是,该值通常会被截断(大约2-3个字符,而不是15个字符),并且包含奇怪的ASCII符号。
答案 0 :(得分:0)
将fscanf()
函数更改为此,将解决您的问题。
代码
fscanf(filepointer, "%s %s %d %s", car[i].name,
car[i].make, &car[i].number, car[i].color);
您可以在fscanf()中找到使用cplusplus.com的真实方法:
char str [80];
FILE * pFile;
pFile = fopen ("myfile.txt","w+");
fscanf (pFile, "%s", str);
但是正如chris-dodd在注释部分所述,在feof(filepointer)
循环not correct中使用while
。
下面的这段代码我使用返回值fscanf()
进行了更正。
我在stack overflow answer by lio
中获得了这种方式main.c
#include <stdio.h>
struct carinfo
{
char name[10];
char make[15];
int number;
char color[10];
}car[4];
int main(){
int i=0;
FILE* filepointer = fopen("file.txt", "r");
if(!filepointer){
printf("can't open file\n");
}
int ret=0;
do {
for(i=0;i<4;i++){
ret=fscanf(filepointer, "%s %s %d %s", &car[i].name,
&car[i].make, &car[i].number, &car[i].color);
printf("%s\n", &car[i].make);
}
} while (ret != EOF);
return 0;
}
file.txt
salam beshoma 10 daram
kee innak 15 inomikhonid!