переменная перезаписывает другую переменную при чтении из файла с использованием sscanf - PullRequest
1 голос
/ 25 марта 2012
#include <stdio.h>
#include <stdlib.h>

#define MAX 21
#define MAX_ELEM 8
#define SCORE 12
#define NUM_SKATER 4
#define BASE 3.1

typedef struct{
                char  name[MAX];
                int   elements;
                float baseval[MAX_ELEM];
                int score[MAX_ELEM][SCORE];
                float total_base;
                float tech_score;
                float total_score;
              }SKATER;

int  getData(SKATER skater[NUM_SKATER]);



int main (void)
{
    // Global Declarations
    SKATER skater[NUM_SKATER];

    // Function calls
    getData(skater);
    return 0;
}

/********************************* getData ************************************
Pre:
Post:
*/
int getData(SKATER skater[NUM_SKATER])
{
    // LOcal Declarations
    FILE* fpIn;
    int   i = 0;
    int   k;
    int   j;
    char  buffer[256];

    // Statements
    if((fpIn = fopen("lab6data.txt","r"))==NULL)
    {
        printf("File opening error");
        system("PAUSE");
        exit(100);
    }

    while(i < NUM_SKATER && fgets(buffer, sizeof(buffer) - 1, fpIn))
    {
        sscanf(buffer,"%19[^0123456789]", &skater[i].name);
        for(k = 0; k < MAX_ELEM; k++)
        {puts(buffer);
            if(fgets(buffer, sizeof(buffer)-1, fpIn) != NULL)
            {
                sscanf(buffer,"%d %f", &skater[i].elements, &skater[i].baseval[k]);
                for(j = 0; j < SCORE; j++)
                {
                    sscanf(buffer,"%d", &skater[i].score[k][j]);

                }
            }

       }

        i++;
    }

    system("PAUSE");
    fclose(fpIn);

    return i;
}

У меня возникли некоторые проблемы с чтением данных из файла, поэтому, когда я добавляю printf к sscanf партитуры и обнаружил, что на самом деле это были распечатанные номера элементов, но не партитура.Я не понимаю, как это происходит.

Может ли кто-нибудь посоветовать исправить это или объяснить мне, что случилось с партитурой?

Допустим, что данные выборки были 1 13,0 1 2 3 0 0 0 2 1 0 3

с первым номером, являющимся номером элемента, вторым номером является базовый номер, а остальными являются баллы, теперь, когда я хотел распечатать счет, он распечатал бы 1 1 1 1 1 1 1 1 1 1
вместо 1 2 3 0 0 0 2 1 0 3

1 Ответ

0 голосов
/ 25 марта 2012

Проблема, с которой вы столкнулись, заключается в том, что вы предполагаете, что sscanf совершает какое-то волшебство, а именно то, что он запоминает, где он находился в buffer после последнего вызова.такая магия, она будет обрабатываться в начале строки, которую вы ей дадите, независимо от того, сколько раз вы уже вызывали ее с этой же строкой.

Итак, вложенная

sscanf(buffer,"%d", &skater[i].score[k][j]);

всегда читает самый первый int в buffer, то есть 1 в вашем образце.Не происходит никакой «перезаписи», вы просто читаете одно и то же снова и снова.

Чтобы это работало, вам нужно отслеживать, где вы должны начать анализ самостоятельно.Это может быть сделано с помощью спецификатора формата %n и «курсора» char * в вашем буфере, например.

Вот пример того, как вы используете это:

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char **argv)
{
    int val;
    int pos;
    char *cur = argv[1];
    printf("Input: [%s]\n", cur);
    while (sscanf(cur, "%d%n", &val, &pos)==1) {
        printf("Read %d, rest is [%s]\n", val, cur+pos);
        cur += pos;
    }
    return 0;
}

Попробуйте запустить этот код с другими параметрами:

$ gcc -Wall t.c
$ ./a.out "1"
Input: [1]
Read 1, rest is []
$ ./a.out "1 2"
Input: [1 2]
Read 1, rest is [ 2]
Read 2, rest is []
$ ./a.out "1 a 2"
Input: [1 a 2]
Read 1, rest is [ a 2]
$ ./a.out "1 2 3 54"
Input: [1 2 3 54]
Read 1, rest is [ 2 3 54]
Read 2, rest is [ 3 54]
Read 3, rest is [ 54]
Read 54, rest is []
$ ./a.out "1.0 2 3 54"
Input: [1.0 2 3 54]
Read 1, rest is [.0 2 3 54]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...