длинное целое число в C - PullRequest
3 голосов
/ 31 мая 2011

Эй, ребята, здесь вопрос новичка.

как я могу прочитать длинное целое число с 12 или 13 цифрами (например, номер ISBN книги) в C? Я хочу прочитать номер из текстового файла с информацией о книгах (ISBN / имя / писатель).

содержимое текстового файла выглядит так:

0393312836

Заводной апельсин

Энтони Берджесс

0199536759

Middlemarch

Брет Истон Эллис

...

...

...

и я использую этот код:

int main(void){

    FILE *f;
    char name[MAX], writer[MAX], line[MAX];
    long isbn;

    f=fopen("path.txt","r");
    if(f == NULL){
        return 0;
        }

    while (fgets(line, 1024, f) != NULL){

        sscanf(line,"%ld", &isbn);
        printf("ISBN: %ld\n",isbn);

        fgets(nome, 1024, f);
        printf("NAME: %s",name);

        fgets(line, 1024, f);
        printf("WRITER: %s",writer);


        }
    fclose(f);

    return 0;

}

он может читать названия книг и авторов, но он читает только цифры, если они имеют 9 цифр или меньше. что я должен сделать, чтобы сделать эту работу?

Заранее спасибо.

Ответы [ 4 ]

8 голосов
/ 31 мая 2011

Просто прочитайте это как строку (char массив) и обработайте это так. С int вы также теряете важные нули на старте вместе с ограниченным диапазоном. Номера ISBN, телефонные номера и тому подобное лучше рассматривать как строки, поскольку они не представляют собой действительные числа (в математическом смысле), а являются просто идентификаторами.

8 голосов
/ 31 мая 2011

Я думаю, что для ISBN вам было бы намного лучше использовать строку.Вам не нужно выполнять арифметику со значением, вы можете хранить начальные нули, и вам понадобится строка для хранения X, которую вы можете получить в контрольной сумме ISBN 10.

1 голос
/ 31 мая 2011

Лучше всего читать их как строки или массивы символов.Номера ISBN - это числа в том смысле, что вы будете делать с ними вычисления.Вместо этого они больше похожи на ссылочную строку, которая просто оказывается числовой.Чтение в массиве символов позволит вам получить номера ISBN, которые содержат тире или другие разделители, как указано здесь: http://www.isbn.org/standards/home/isbn/international/html/usm4.htm

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

1 голос
/ 31 мая 2011

Попробуйте использовать unsigned long long и спецификатор %llu. Первый должен быть 64-битным числом на большинстве платформ.

Вы также можете попробовать прочитать его как строку. Это зависит от того, хотите ли вы манипулировать им как строкой или числом позже.

Например, если вы хотите отсортировать их по алфавиту, считайте их как строки. Если вы хотите отсортировать их как числа, рассматривайте их как числа.

...