我有一个文本文件,我填写了不同文本的数字行,具有不同的行长度。
我想要做的是计算在我的工作中对我来说重要的每行平均数字。我在C中编写了以下代码来实现这一目标。但是编译后我无法运行程序。
#include<stdio.h>
#include<stdlib.h>
#define LENGTH 10000000
int main()
{
char c;
int i;
int line_length;
int j;
int char_count;
char char_a[LENGTH];
int line_a[LENGTH];
int line_count;
long sum;
float avg_char_count;
FILE *fp=fopen("input.txt","r");
if(!fp){
fprintf(stderr,"cannot open file");
exit(1);
}
/*read into file*/
i=0;
sum=0;
while(char_a[i++]=fgetc(fp))
sum++;
printf("chars count: %d \n",sum);
/*process array*/
char_count=i;
j=0;
line_count=0;
while(j++<char_count){
if(char_a[j]=='\n'){
sum--;
line_count++;
}
}
/* calculate the average*/
avg_char_count=sum/(float)line_count;
printf("\naverage # of chars in a line is: %f\n ",avg_char_count);
return EXIT_SUCCESS;
}
顺便说一句,我使用的是Borland C ++命令行工具BCC32,在Windows 7 SP1上运行 我的代码出了什么问题?
答案 0 :(得分:0)
最可能的原因是你在堆栈上分配了20 Mb的变量。
我会更改程序,以便它一次在线读取文件(或者一次只读取一个字符)。 这样你只需要为一行而不是整个文件分配空间。
答案 1 :(得分:0)
尝试将char_a和line_a声明为char和int的指针:
char *char_a;
int *line_a;
然后使用malloc动态分配内存。
char_a=(char*)malloc(10000000*sizeof(char));
line_a=(int*)malloc(10000000*sizeof(int));
其次,你的while循环应该在你到达文件末尾时结束,即EOF。
while(char_a[i]=fgetc(fp)){
if(char_a[i++]==EOF)
break;
sum++;
}
而且,你应该将line_count初始化为1而不是0,因为当没有&#39; \ n&#39;在文本文件中,仍然可以有一行。如果有一个&#39; \ n&#39;在文本文件中,这意味着有两行(比如说,你在第1行,然后你点击回车,这是&#39; \ n&#39;,然后你到达新行,所以对于一行&#39; \ n&#39;,有2行。
/*process array*/
char_count=sum;
j=0;
line_count=1;
while(j++<char_count){
if(char_a[j]=='\n'){
sum--;
line_count++;
}
}
注意 - 目前,您的char_count在打印时包含换行符(&#39; \ n&#39;)。最后打印语句,因为在程序结束时,您已经通过减少第二个while循环的if语句中的总和来排除换行。