практика пробок кода - проблема чтения - PullRequest
1 голос
/ 05 мая 2011

Я имею в виду замятие кода, потому что большинство из вас поймет, какой у нас входной файл.проблема в том, что - квалификация 2010 (snapper)

Проблема, с которой я сталкиваюсь в моей программе, заключается в том, что она читает первый вход 100005 как 10000 5 как два целых числа, таким образом изменяя весь вход в программу,Вот мой код для чтения ввода:

#include<stdio.h>

int main()
{
    FILE *op=fopen("20101op.txt","w");
    FILE *ip=fopen("A-small-practice.in","rt");

    long int  i,N,K,c;
    fscanf(ip,"%ld ",&c);

    printf("%d \t", c);
    fscanf(ip,"%ld ",&N);
    printf("%d \t", N);
    fscanf(ip,"%ld ",&K);
    printf("%d \t", K);

    fclose(op);
    fclose(ip);

    return 0;
}

Пожалуйста, помогите мне выяснить причину этой проблемы!

Ответы [ 2 ]

3 голосов
/ 05 мая 2011

Похоже, ваш компилятор пытается предотвратить переполнение, ограничивая fscanf 16-битами.

Какой компилятор (и версию) и какую операционную систему вы используете?32 или 64 бита?

Кроме того, что возвращает fscanf?

(Проверьте это, изменив эту строку:

fscanf(ip,"%ld ",&c);

на эти строки:)

int rv;
rv = fscanf(ip,"%ld ",&c);
printf("fscanf() returned: %d\n", rv);

Примечание. Я не могу комментировать приведенный выше ответ (недостаточно репутации), но в некоторых компиляторах 't' явно указывает, что файл является текстовым файлом.

Обновление : эта функция должна анализировать длинные символы за символом.См. Мой комментарий об использовании этого.

int fparselong(FILE * fp, long * ip)
{
    int parsed = 0;
    *ip = 0;
    int c;
    while((c = fgetc(fp)) != EOF)
    {
        // c is newline, return 0 if nothing has been parsed, 1 if something has
        if(c == '\n'){ return parsed; }
        // check for oob
        if(c < '0' || c > '9'){ return -1; }
        // Update ip
        *ip = *ip * 10 + (c - '0');
        // Something has been parsed
        parsed = 1;
    }
    // EOF received
    return -2;
}

Так что вместо:

fscanf(ip,"%ld ",&c);

Вы бы получили:

fparselong(ip, &c);

Опять же, если это сработает, донаНе используйте его, но найдите другой компилятор.Если это не так, это означает, что в вашем файле появляется неожиданный символ.Вы можете hexdump ваш входной файл или использовать другие способы определения этого.

0 голосов
/ 05 мая 2011

Вам необходимо проверить возвращаемые значения ALL функций библиотеки ввода (fopen, fscanf).

Также в недопустимом символе ('t') естьаргумент режима 2-го fopen.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...