前言
本文分为两部分,其中一部分主要使用C语言编程实现读取文件内容(要打开的文件名称采用命令行方式输入),统计文件内容的行数,并将文件内容保存到数组里面打印输出。
另一部分使用C语言编程实现读取文件内容(要打开的文件名称采用命令行方式输入),统计文件内容的行数,保存文件内容的数组采用动态分配内存的方式,这样不管文件大小,都可以进行文件内容读取保存。同时还可将读取的文件内容使用fprintf函数保存到另一个文件中。
第一部分
对保存文件内容的数组分配200个int型长度的内存。
主要使用c语言从命令行输入文件,读入文件,统计行数,并将文件内容保存到数组里面。
程序
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int main(int argc,char* argv[]) //命令行传参,argc代表传入参数个数,argv表示传入的参数
{
int i,j;
int k=0;
int count=0; //统计文件中字符个数
int sum_row; //统计文件中字符个数
int flag=0;
FILE *fp; //文件指针
FILE *fp1;
int a_in[200]; //保存文件内容的数组
int b_in[200]; //保存文件内容的数组
fp=fopen(argv[1],"r"); //打开文件,只读
//fp1=fopen("int_data.txt","r");
fp1=fopen(argv[1],"r");
if(fp==NULL)
{
printf("File cannot open! " );
//exit;
return 0;
}
if(argc!=2) //判断输入参数个数,如果不为2个就报错
{
printf("参数个数错误");
return -1;
}
while(!feof(fp)) //读文件,直到文件末尾
{
flag = fgetc(fp); //将文件内容附给flag
if(flag == '\n') //如果为\n表示到行尾,便进行计数
count++;
}
sum_row = count+1; //加上文件最后一行,即为文件总的行数
printf("文件行数为:%d",sum_row); //打印文件行数,因为每行只有一个数,所以即统计文件中有多少个数
printf("\n");
for(i=0;i<sum_row;i++) //控制文件行数
{
for (j=0;j<1;j++) //控制文件列数
{
fscanf(fp1,"%d",&a_in[j]); //将文件其中一行内容保存到数组中
b_in[k]=a_in[j]; //将读到的每一行的数据都保存到b_in数组中
k++; //行数加一
}
}
printf("文件内容为:\n");
for (i=0;i<k;i++) //循环打印保存到数组中的数据
{
printf("%d\t",b_in[i]); //打印
}
fclose(fp); //关闭文件,释放指向文件的指针
fclose(fp1); //关闭文件,释放指向文件的指针
return 0;
}
运行结果
- 注 运行采用tcc运行C程序
文件内容为从1到110个数,每个数存储在一行
运行结果:
C:\Users\CL\Desktop\学习\C\conv\fprintf>tcc read1.c
C:\Users\CL\Desktop\学习\C\conv\fprintf>read1.exe int_data.txt
文件行数为:110
文件内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
106 107 108 109 110
第二部分
主要实现C语言从命令行输入文件,读入文件,统计行数,对保存文件内容的数组进行动态内存分配,并将文件内容保存到数组里面,打印输出,同时将读入的文件内容保存到另外一个文件中。
程序
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int main(int argc,char* argv[]) //命令行传参,argc代表传入参数个数,argv表示传入的参数
{
int i,j;
int k=0;
int count=0; //统计文件中字符个数
int sum_row; //统计文件中字符个数
int flag=0; //用于暂时将文件内容保存
FILE *fp; //文件指针
FILE *fp1;
FILE *fp2;
int *a_in; //用于读文件中的数据
int *b_in; //用于保存从文件中读入的数据
fp=fopen(argv[1],"r"); //打开文件,只读,argv[1]代表从命令行输入的文件名称,即运行.exe程序时输入的第二个参数
fp1=fopen(argv[1],"r"); //再次打开文件,(第一次打开文件用于统计文件的行数,即数据的个数)用于将文件内容保存到指针数组里
fp2=fopen("test1.txt","w"); //打开文件,只写,用于将数组内容重新保存到另一个文件中
if(fp==NULL) //打开文件失败
{
printf("File cannot open! ");
//exit;
return 0;
}
if(argc!=2) //判断输入参数个数,如果不为2个就报错
{
printf("参数个数错误");
return -1;
}
while(!feof(fp)) //读文件,直到文件末尾
{
flag = fgetc(fp); //将文件内容附给flag
if(flag == '\n') //如果为\n表示到行尾,便进行计数
{
count++; //统计文件行数
}
}
sum_row = count+1; //加上文件最后一行,即为文件总的行数
printf("文件行数为:%d",sum_row); //统计文件行数,因为每行只有一个数,所以即统计文件中有多少个数
printf("\n");
a_in = (int*)malloc(sizeof(int)*200); //动态分配用于保存文件内容的指针数组长度,以免溢出
b_in = (int*)malloc(sizeof(int)*200); //动态分配用于保存文件内容的指针数组长度,以免溢出
if (!a_in) //动态内存分配失败
{
printf("内存分配失败");
return-1;
}
if (!b_in) //动态内存分配失败
{
printf("内存分配失败");
return-1;
}
for(i=0;i<sum_row;i++) //控制文件行数
{
for (j=0;j<1;j++) //控制文件列数
{
fscanf(fp1,"%d",&a_in[j]); //将文件其中一行内容保存到指针数组中
b_in[k]=a_in[j]; //将读到的每一行的数据都保存到b_in指针数组中
k++; //行数加一
}
}
printf("文件内容为:\n");
for (i=0;i<k;i++) //循环打印保存到指针数组中的数据
{
printf("%d\t",b_in[i]); //打印
fprintf(fp2,"%d\n",b_in[i]); //将保存到数组的数据保存到test1.txt文件中
}
fclose(fp); //关闭文件,释放指向文件的指针
fclose(fp1); //关闭文件,释放指向文件的指针
fclose(fp2);
return 0;
free(a_in); //释放指针
free(b_in); //释放指针
return 0;
}
文件内容为从1到110个数,每个数存储在一行。
结果
C:\Users\CL\Desktop\学习\C\conv\fprintf>tcc read2.c
C:\Users\CL\Desktop\学习\C\conv\fprintf>read2.exe int_data.txt
文件行数为:110
文件内容为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
106 107 108 109 110
保存到新文件的结果:
到此就成功实现了使用C语言进行文件内容读取,统计个数,保存到数组的功能,同时也实现了数据重新保存到另一个文件中。
如何从命令行输入数据,并保存到文件中,可参考我的另一篇博客:
c语言从命令行输入数据,并保存到文件中
对于如何统计每行有多个数据的文件中数据的个数,可参考我的博客:
c语言命令行传参输入要读入的文件,统计文件中字符的个数