Всего цифр и цифр в строке в C?

Можете ли вы помочь мне найти мою ошибку в подсчете количества цифр в строке, а затем сравнить его с общим числом. Вот моя программа, которая подсчитывает количество цифр в строке:

#include<stdio.h>
#include<string.h>
#include<ctype.h>

int main()
{    
    int pc, c, NumbersPerLine= 0, NumbersTotal=0, line= 1; 
    FILE *inputFile;

    if(!(inputFile=fopen("C:\\Test\\Test.txt","r")))
    {
        printf("the file does not exist\n");
        return 0;
    }

    for (pc='\n', c=fgetc(inputFile);c!=EOF;pc=c,c=fgetc(inputFile)) 
        { 
            if (isdigit(c))
            {
                NumbersPerLine++;
            }
            else 
                if (c=='\n') 
                {  
                 printf("%d %d\n", line++, NumbersPerLine); 
                 NumbersPerLine= 0;
                } 
        }     
        if (pc!='\n') printf("%d %d %d\n", line, NumbersPerLine); 
        fclose(inputFile);
}

Но теперь мне также нужно добавить общее количество цифр в файл, и все, что я сделал, это посчитал их построчно, а затем суммировал их вместо того, чтобы считать их все. Я пытался получить такой результат:

1 (that's the number of the line) 5 (the number of digits per line) 18 (total digits) 
2 5 18 
3 4 18 
4 1 18 
5 1 18 
6 1 18 
7 1 18 

Я попытался поставить NumbersTotal++; после NumbersPerLine++;, но все, что я получил, это:

"1 5 5 
2 5 10 
3 4 14 
4 1 15 
5 1 16 
6 1 17 
7 1 18"

Я также пытался использовать do-while до «для»

c=fgetc(inputFile);        
do        
{        
NumbersTotal++;        
}while(isdigit(c));        

но после того, как это условие выполнено, программа завершается и не продолжается с for. Можешь мне помочь?


person user3201502    schedule 19.01.2014    source источник
comment
на строку -> используйте fgets() вместо fgetc(). И этот цикл for ужасен.   -  person    schedule 19.01.2014
comment
Нет ничего более раздражающего, чем получение сообщения об ошибке, в котором говорится, что файл не существует, когда он существует. Попробуйте char *path="C:..."; if(!(inputFile=fopen(path, "r"))) { perror(path);return EXIT_FAILURE;}   -  person William Pursell    schedule 19.01.2014


Ответы (3)


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

person William Pursell    schedule 19.01.2014

[Изменить] Благодаря редактированию @BLUEPIXY стало яснее видеть, что OP хочет, чтобы окончательная сумма печаталась в каждой строке.

Сделайте 2 прохода. Первый, чтобы найти общее количество, второй проход, чтобы сделать печать.

Также используйте

int NumbersTotal = 0;
while ((c = fgetc(inputFile)) != EOF) {
  if (isdigit(c)) NumbersTotal++;
}

rewind(inputFile);

// The rest same as OP with matching format specifiers and arguments.
for (pc='\n', c=fgetc(inputFile);c!=EOF;pc=c,c=fgetc(inputFile)) { 
  if (isdigit(c)) {
    NumbersPerLine++;
  }
  else if (c=='\n') {  
    printf("%d %d %d\n", line++, NumbersPerLine, NumbersTotal);
    NumbersPerLine= 0;
    }     
  }
}

if (pc!='\n') {
  printf("%d %d %d\n", line, NumbersPerLine, NumbersTotal); 
}
fclose(inputFile);

Синтаксис цикла for() может потребовать некоторого рефакторинга. Пример:

for (pc ='\n'; (c=fgetc(inputFile)) != EOF;  pc=c) { 
person chux - Reinstate Monica    schedule 19.01.2014

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

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void){
    int ch, NumbersPerLine= 0, NumbersTotal = 0, line = 0; 
    FILE *fin, *fp;
    char line_buff[32], *fname = "result.tmp";

    fin = fopen("data.txt", "r");//Check omitted
    fp  = fopen(fname, "w+");
    for(;;){
        ch = fgetc(fin);
        if(isdigit(ch)){
            ++NumbersPerLine;
        } else if(ch == '\n' || ch == EOF){
            NumbersTotal += NumbersPerLine;
            fprintf(fp, "%d %d %%d\n", ++line, NumbersPerLine); 
            NumbersPerLine= 0;
            if(ch == EOF) break;
        }
    }
    fclose(fin);
    fflush(fp);
    rewind(fp);
    while(fgets(line_buff, sizeof(line_buff), fp)){
        printf(line_buff, NumbersTotal);
    }
    fclose(fp);
    remove(fname);
    return 0;
}
person BLUEPIXY    schedule 20.01.2014