尝试在一行中fscanf多个值(3个字符串+整数)

时间:2019-04-11 01:25:48

标签: c file scanf

我需要从一个已经存在的文件中扫描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符号。

1 个答案:

答案 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!