你能帮我找出错误,计算每行的位数,然后将它与总数进行比较。这是我的程序,它计算每行的位数:
#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”。你能救我吗?
答案 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;
}