0

最初の最初の 4 桁が次の最初の 4 桁と異なる 2 つの行が見つかるまで、ファイルをナビゲートしようとしています。そのために、必要なシーケンスが見つかるまで fseek を使用してナビゲートしてきました。これは 10 年ごとの人口のリストで、10 年ごとに複数の行がありますが、古い年から新しい年まですべて順番に並んでいます。そして、メインで ftell を使用して最初のオフセットを取得し、ファイルの途中から読み取りを開始できるようにします。

ここでの問題は、オフセットが正であり、前方に移動する必要がある場合でも、後方に移動し続けることです。

それを進める必要がある行は次のとおりです。

encontrar_inicio(f, ano, offset/2);

そして、これはそれが示すものです:

1980 é maior que 1950 ano maior, anda para a frente
1980 é maior que 1910 ano maior, anda para a frente
1980 é maior que 1900 ano maior, anda para a frente
1980 é maior que 1880 ano maior, anda para a frente
1980 é maior que 1860 ano maior, anda para a frente

1980 年は [年] よりも大きいと言われています。先に進んでください。しかし、そうではありません。そして、それらの行を提供するprintfの後に、私が上に投稿した行があります。

そして、これは関数全体です:

void encontrar_inicio (FILE *f, int ano, long int offset)
{
    int i, meio, ano2;
    char aux[100], aux2[100], aux3[100], lixo[100];

    //printf("%lu\n", offset);
    fseek( f, offset, SEEK_SET);

    fgets(aux, 100, f);

    fgets(aux2, 5, f);

    ano2 = atoi(aux2);

    if(ano==ano2)
    {
        printf("%d é igual a %d anos iguais, anda para trás\n", ano, ano2);
        encontrar_inicio(f, ano, -offset/2);//go back in the file
    }
    if(ano != ano2)
    {   if(ano < ano2)
        {
            printf("%d é menor q %d ano menor, anda para trás\n", ano, ano2);
            encontrar_inicio(f, ano, -offset/2);//go back in the file
        }
        if(ano > ano2)
        {
            printf("aqui\n");
            fgets(lixo, 100, f);//next line
            fgets(aux3, 5, f);
            int ano3 = atoi(aux3);


            if(ano==ano3)
            {
                printf("%d é igual a %d Encontrou o ano, começa a ler\n", ano, ano3);
                return;
                //começa a ler
            }
            if(ano!=ano3)
            {
                printf("%d é maior que %d ano maior, anda para a frente\n", ano, ano3);
                encontrar_inicio(f, ano, offset/2); //go forward in the file

            }

        }
    }
}

私はいくつかのことを変更してきましたが、これ以上のことはできません。どんな助けでも大歓迎です。

また、初めての質問なので間違っていたらすみません。

読み取り元のファイルは次のようになります(すべての数十年が真ん中にあります):

year,age,marst,sex,people
1850,0,0,1,1483789
1850,0,0,2,1450376
1850,5,0,1,1411067
2000,90,4,2,29292
2000,90,5,1,147615
2000,90,5,2,774069
2000,90,6,1,15627
2000,90,6,2,59113

編集 - このようにして終了し、魅力のように機能しています。

void encontrar_inicio (FILE *f, int ano, long offsetmin, long offsetmax)
{
    int ano2;
    char aux[100], aux2[200], aux3[100], *aux4, lixo[100], lixo2[100];
    long meio;

    meio = (offsetmin+offsetmax)/2;

    int anoinicio = inicio_ficheiro_ano(f);

    if(ano==anoinicio)
    {
        printf("%d igual a %d, começar a ler", ano, anoinicio);
        //inserir dados em;
        return;
    }

    fseek( f, meio, SEEK_SET);

    fgets(aux, 100, f);

    fgets(aux2, 200, f);

    aux4 = strtok(aux2, ",");

    ano2 = atoi(aux4);

    if(ano==ano2)
    {
        printf("%d é igual a %d anos iguais, anda para trás\n", ano, ano2);
        //return;
        encontrar_inicio(f, ano, offsetmin, meio);//go back in the file
    }
    if(ano != ano2)
    {   if(ano < ano2)
        {
            printf("%d é menor q %d ano menor, anda para trás\n", ano, ano2);
            //return;
            encontrar_inicio(f, ano, offsetmin, meio);//go back in the file
        }
        if(ano > ano2)
        {
            fgets(lixo, 100, f);//next line
            fgets(aux3, 5, f);
            int ano3 = atoi(aux3);

            if(ano==ano3)
            {
                printf("%d é igual a %d Encontrou o ano, começa a ler\n", ano, ano3);
                fseek(f, -strlen(aux2), SEEK_CUR);
                return;
                //começa a ler
            }
            if(ano!=ano3)
            {
                printf("%d é maior que %d ano maior, anda para a frente\n", ano, ano3);
                encontrar_inicio(f, ano, meio, offsetmax); //go forward in the file

            }

        }
    }
}
4

2 に答える 2

0

SEEK_CUR現在の位置に相対的にシークするために使用したい場合がSEEK_SETありますが、これは絶対的な位置です。

于 2013-05-22T06:13:21.220 に答える
0

最初のものを次のように変更してみてくださいencontrar_inicio:

encontrar_inicio(f, ano, offset/2);

(あなたのバージョンは負のオフセットを使用しています)

そして2番目に:

encontrar_inicio(f, ano, offset + ((maxOffset - offset)/2));

(あなたのバージョンは前進するのではなく、後退していました。オフセットはオフセット/2 より大きいです)

于 2013-05-22T00:41:37.183 に答える