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

问题描述 投票:0回答:1

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

c file scanf
1个回答
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)循环while中的not correct所述。

我在下面的代码中使用fscanf()返回值来更正它。

我在stack overflow answer by lio获得这种方式

Complete version of your program

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!
© www.soinside.com 2019 - 2024. All rights reserved.