我需要从已经存在的文件中扫描3个字符串和一个整数,并将它们作为元素保存在结构数组中。该文件的格式如下:
string1 string2整数string3
string1 string2整数string3
... 等等。
当fscanf为他们时,它正确扫描string1,整数和string3。但是,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符号。
将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)
循环while
中的not correct所述。
我在下面的代码中使用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!