前言
本文主要实现功能:用c语言编写程序,实现从命令行传参输入要读入的文件,并动态分配用于保存文件数据内容的数组内存,统计文件中字符的个数,并将文件内容打印输出。
- 注 (1)本文中统计字符个数的程序只针对字符之间以空格隔开,并且数据之间只能有一个空格,同时行首不能以空格开始,但对于行数,和每行有多少个数据无要求。
(2)对于数据,为字符,整型数字,字符串等都同样适用(对于字符串,空格与空格之间只算一个字符),但如果要打印结果,则只能为字符,因为文中定义的为char型指针(为了读文件需要,fgetc函数要求保存文件内容的数组为char型)
对于如何将数据保存到文件中,以及关于动态内存分配的问题,可参考我的另一篇博客:
c语言从命令行输入数据,并保存到文件中
主程序
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int main(int argc,char* argv[]) //命令行传参,argc代表传入参数个数,argv表示传入的参数
{
char *a_in; //用于保存从文件中读入的数据
int i;
int count1=-1; //统计文件中字符个数
FILE *in1; //用于指向文件地址
if(argc!=2) //判断输入参数个数,如果不为2个就报错
{
printf("参数个数错误");
return -1;
}
in1=fopen(argv[1],"r"); //打开文件,只读,argv[1]表示文件的第二个参数,第一个参数为argv[0],表示运行的命令参数
if(in1==NULL) //无法打开文件
{
printf("File cannot open! " );
//exit;
return 0;
}
a_in = (char*)malloc(sizeof(char)*100); //动态内存分配
if (!a_in) //分配内存失败
{
printf("内存分配失败");
return-1;
}
printf("c_data文件中的数据为:\n");
while((*(a_in)=fgetc(in1))!=EOF) //只要未到文件末尾就继续读
{
printf("%s\t",a_in); //打印文件内容,此处打印的文件数据为字符
if(*(a_in)=='\n' || *(a_in)==' ') //判断不是空格或换行就计数
{
count1++; //统计有多少个数
}
}
printf("\n");
printf("c_data.txt中数字个数为:%d\n",count1); //打印计数结果
fclose(in1); //关闭文件指针
return 0;
free(a_in);//释放第一维指针
return 0;
}
文件内容为26个英文字母,以空格隔开,打印时按行打印。
文件内容如下:
运行结果
因为加了tab键,所以打印结果时从第二行开始会先有一个tab空格。
对于同时含有整型数字,double型数字,以及字符时同样适用。
但由于打印文件内容包含数字,字符,打印时对于数字会有点乱码,所以这里就不打印结果了,只统计个数。
此时文件内容为:
运行结果
C:\Users\CL\Desktop\学习\C\conv\fprintf>tcc read.c
C:\Users\CL\Desktop\学习\C\conv\fprintf>read.exe c_data.txt
c_data.txt中数字个数为:64
到这里就成功读入文件,并计算出文件中数据个数。