Попытка fscanf нескольких значений (3 строки + целое число) в одной строке - PullRequest
0 голосов
/ 11 апреля 2019

Мне нужно отсканировать 3 строки и целое число из уже существующего файла и сохранить каждую из них как элемент в массиве структур. Файл отформатирован так:

строка1 строка2 целое число строка3

строка1 строка2 целое число строка3

... и т. Д.

при поиске для них он правильно сканирует string1, integer и string3. Тем не менее, строка2 всегда создает ошибку при сканировании, и когда любая из строк2 печатается, они либо обрезаются, либо имеют какой-то нечетный символ 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 голосов
/ 11 апреля 2019

Изменение функции 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 loop не правильно .

Этот код ниже я исправляю, используя fscanf() возвращаемое значение.

Я получаю этот способ в ответе переполнения стека: 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!
...