2012-03-06 3 views
0

Im в настоящее время изучает C через случайные вопросы математики и ударил стену. Я пытаюсь прочитать в 1000 цифр массиву. Но без указания размера массива сначала я не могу этого сделать. Мой ответ состоял в том, чтобы подсчитать количество целых чисел в файле, а затем установить его как размер массива. Однако моя программа возвращает 4200396 вместо 1000, как я надеялся. Не уверен, что происходит.Простой подсчет количества целых чисел в файле в C

мой код: EDIT

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

int main (void) 
{ 
    FILE* fp; 
    const char filename[] = "test.txt"; 
    char ch; 
    int count = 0; 

    fp = fopen(filename, "r"); 
    if(fp == NULL) 
    { 
     printf("Cannot open file: %s\n", filename); 
     exit(8); 
    } 

    do 
    { 
     ch = fgetc (fp); 
     count++; 
    }while (ch != EOF); 

    fclose(fp); 

    printf("Text file contains: %d\n", count); 


    return EXIT_SUCCESS; 
} 

файл test.txt:

731671765313306249192251196744265747423553491949349698352031277450632623957831801698480186947885184385861560789112949495459501737958331952853208805511 
125406987471585238630507156932909632952274430435576689664895044524452316173185640309871112172238311362229893423380308135336276614282806444486645238749 
303589072962904915604407723907138105158593079608667017242712188399879790879227492190169972088809377665727333001053367881220235421809751254540594752243 
525849077116705560136048395864467063244157221553975369781797784617406495514929086256932197846862248283972241375657056057490261407972968652414535100474 
821663704844031998900088952434506585412275886668811642717147992444292823086346567481391912316282458617866458359124566529476545682848912883142607690042 
242190226710556263211111093705442175069416589604080719840385096245544436298123098787992724428490918884580156166097919133875499200524063689912560717606 
0588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450 

Любая помощь будет большим.

+0

Если вы хотите прочитать отдельные целые числа, их нужно разграничить - иначе вся последовательность цифр будет рассматриваться как одно целое * (которое будет переполняться несколько раз). Если вы хотите подсчитать символы, используйте 'fgetc' для подсчета (или есть лучшие альтернативы для возврата размера файла и т. Д.) – Nim

+0

Поскольку вы не используете' isdigit() 'или какой-либо другой механизм для проверки того, что цифры на самом деле являются цифрами, вы можете просто использовать размер файла. – technosaurus

ответ

4

Вы забыли инициализировать count, поэтому он содержит случайный мусор.

int count = 0; 

(Но обратите внимание, что с этим изменением он все еще не будет работать, так как %d в формате scanf означает читать больше цифр, как вы считаете, а не читать одну цифру.)

+0

Итак, как бы вы произносили по одной цифре за раз? если есть способ? – SD1990

+0

@ spartan2417: самый простой способ - прочитать символы по одному с помощью 'getchar', а затем проверить, являются ли они цифрами с' isdigit'. –

+0

ok добавил новый способ использования fgetc. im становится ближе, так как мой ответ дает 1007 сейчас. – SD1990

0

Путь C Инициализация значений не указывается. Большую часть времени это мусор. Ваша переменная count не инициализирована, поэтому она в основном имеет огромное значение, например 1243435, попробуйте int count = 0.

+0

Фактически, он имеет значение 4200389 в запуске программы OP. –

+0

ОК ... это был просто пример. Это мусор все-таки ... – Fred

0

Включите предупреждения своего компилятора (-Wall), он скажет вам, что вы не инициализировали count, что является проблемой: он может содержать абсолютно что угодно, когда запускается ваша программа.

Так инициализировать его:

int count = 0; 

Другая проблема заключается в том, что scanf s не будет делать то, что вы хотите, на всех. %d будет соответствовать ряду цифр (число), а не отдельной цифре. Если вы хотите сделать такой подсчет, используйте %c для чтения отдельных символов.

Другой подход, обычно используемый (если вы знаете, что файл не обновляется) заключается в использовании fseek/ftell для поиска в конце файла, получения позиции (которая сообщит вам ее размер), затем вернитесь к началу.

Самый быстрый подход, хотя должен был бы использовать stat или fstat, чтобы получить информацию о размере файла из файловой системы.

1

Если вы хотите количество цифр тонко вы Tave сделать это обугливается-на-полукокса, например:

while (isdigit(fgetc(file_decriptor)) 
    count++; 

Посмотрите fgetc, ЕОКП и зсапЕ в страницах руководства, вы, кажется, не понимают, что происходит в вашем коде.

Смежные вопросы