C中每行的总数字和位数?

时间:2014-01-19 15:24:18

标签: c numbers digits

你能帮我找出错误,计算每行的位数,然后将它与总数进行比较。这是我的程序,它计算每行的位数:

#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"

我也试过在'for'之前使用do-while

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

但在满足该条件后,程序结束,并且不会继续“for”。你能救我吗?

3 个答案:

答案 0 :(得分:1)

如果您仔细阅读该文件,则必须重新打开该文件或寻找开头再次阅读该文件。但是,只读一次文件并在该循环期间跟踪两个统计信息会更加清晰。

答案 1 :(得分:1)

[编辑]感谢@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) { 

答案 2 :(得分:0)

当文件成为负担时,将中间结果写入文件的策略是两次读取文件。

#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;
}