本文分为两部分,其中一部分主要使用C语言编程实现读取文件内容(要打开的文件名称采用命令行方式输入),统计文件内容的行数,并将文件内容保存到数组里面打印输出。
另一部分使用C语言编程实现读取文件内容(要打开的文件名称采用命令行方式输入),统计文件内容的行数,保存文件内容的数组采用动态分配内存的方式,这样不管文件大小,都可以进行文件内容读取保存。同时还可将读取的文件内容使用fprintf函数保存到另一个文件中。
对保存文件内容的数组分配200个int型长度的内存。
主要使用c语言从命令行输入文件,读入文件,统计行数,并将文件内容保存到数组里面。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
int main(int argc,char* 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(argv[1],"r");
if(fp==NULL)
printf("File cannot open! " );
return 0;
if(argc!=2)
printf("参数个数错误");
return -1;
while(!feof(fp))
flag = fgetc(fp);
if(flag == '\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];
k++;
printf("文件内容为:\n");
for (i=0;i<k;i++)
printf("%d\t",b_in[i]);
fclose(fp);
fclose(fp1);
return 0;
文件内容为从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[])
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");
fp1=fopen(argv[1],"r");
fp2=fopen("test1.txt","w");
if(fp==NULL)
printf("File cannot open! ");
return 0;
if(argc!=2)
printf("参数个数错误");
return -1;
while(!feof(fp))
flag = fgetc(fp);
if(flag == '\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];
k++;
printf("文件内容为:\n");
for (i=0;i<k;i++)
printf("%d\t",b_in[i]);
fprintf(fp2,"%d\n",b_in[i]);
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语言命令行传参输入要读入的文件,统计文件中字符的个数
前言本文分为两部分,其中一部分主要使用C语言编程实现读取文件内容(要打开的文件名称采用命令行方式输入),统计文件内容的行数,并将文件内容保存到数组里面打印输出。另一部分使用C语言编程实现读取文件内容(要打开的文件名称采用命令行方式输入),统计文件内容的行数,保存文件内容的数组采用动态分配内存的方式,这样不管文件大小,都可以进行文件内容读取保存。同时还可将读取的文件内容使用fprintf函数保存...
在刷题过程中,遇到的读取文件问题,只是记录自己的问题,新手~如果在一个txt文件当中有以下数据12 34 5 67 8 9 101.如果我们只是简单将这些数据保存在一个数组中:#include <iostream>
#include <fstream>
using namespace std;
int main()
int i...
typedef struct {
uint16_t bfType; // 位图文件类型,必须为"BM"
uint32_t bfSize; // 位图文件大小,以字节为单位
uint16_t bfReserved1; // 保留,必须为0
uint16_t bfReserved2; // 保留,必须为0
uint32_t bfOffBits; // 从文件头到像素数据的偏移量,以字节为单位
} BITMAPFILEHEADER;
// 位图信息头结构体
typedef struct {
uint32_t biSize; // 位图信息头大小,以字节为单位
int32_t biWidth; // 图像宽度,以像素为单位
int32_t biHeight; // 图像高度,以像素为单位
uint16_t biPlanes; // 必须为1
uint16_t biBitCount; // 每个像素的位数,必须是1, 4, 8或24
uint32_t biCompression; // 压缩类型,0为不压缩
uint32_t biSizeImage; // 图像大小,以字节为单位
int32_t biXPelsPerMeter; // 水平分辨率,以像素/米为单位
int32_t biYPelsPerMeter; // 垂直分辨率,以像素/米为单位
uint32_t biClrUsed; // 实际使用的调色板索引数,0为使用所有调色板索引
uint32_t biClrImportant; // 对图像显示有重要影响的颜色索引数,0表示所有颜色都是重要的
} BITMAPINFOHEADER;
// 读取位图文件头
BITMAPFILEHEADER read_file_header(FILE* fp) {
BITMAPFILEHEADER header;
fread(&header.bfType, sizeof(header.bfType), 1, fp);
fread(&header.bfSize, sizeof(header.bfSize), 1, fp);
fread(&header.bfReserved1, sizeof(header.bfReserved1), 1, fp);
fread(&header.bfReserved2, sizeof(header.bfReserved2), 1, fp);
fread(&header.bfOffBits, sizeof(header.bfOffBits), 1, fp);
return header;
// 读取位图信息头
BITMAPINFOHEADER read_info_header(FILE* fp) {
BITMAPINFOHEADER header;
fread(&header.biSize, sizeof(header.biSize), 1, fp);
fread(&header.biWidth, sizeof(header.biWidth), 1, fp);
fread(&header.biHeight, sizeof(header.biHeight), 1, fp);
fread(&header.biPlanes, sizeof(header.biPlanes), 1, fp);
fread(&header.biBitCount, sizeof(header.biBitCount), 1, fp);
fread(&header.biCompression, sizeof(header.biCompression), 1, fp);
fread(&header.biSizeImage, sizeof(header.biSizeImage), 1, fp);
fread(&header.biXPelsPerMeter, sizeof(header.biXPelsPerMeter), 1, fp);
fread(&header.biYPelsPerMeter, sizeof(header.biYPelsPerMeter), 1, fp);
fread(&header.biClrUsed, sizeof(header.biClrUsed), 1, fp);
fread(&header.biClrImportant, sizeof(header.biClrImportant), 1, fp);
return header;
// 读取位图像素数据,返回灰度值数组
unsigned char* read_pixels(FILE* fp, BITMAPINFOHEADER info_header) {
// 计算每一行像素占用的字节数
int row_bytes = (info_header.biBitCount * info_header.biWidth + 31) / 32 * 4;
// 分配内存并读取像素数据
unsigned char* pixels = (unsigned char*)malloc(info_header.biHeight * info_header.biWidth);
int i, j;
for (i = 0; i < info_header.biHeight; i++) {
// 计算当前行的灰度值,并保存到数组中
for (j = 0; j < info_header.biWidth; j++) {
unsigned char bgr[3];
fread(bgr, 1, 3, fp);
pixels[i * info_header.biWidth + j] = 0.299 * bgr[2] + 0.587 * bgr[1] + 0.114 * bgr[0];
// 跳过当前行的填充字节
fseek(fp, row_bytes - info_header.biWidth * 3, SEEK_CUR);
return pixels;
int main(int argc, char* argv[]) {
if (argc < 2) {
printf("Usage: %s filename\n", argv[0]);
return 1;
FILE* fp = fopen(argv[1], "rb");
if (fp == NULL) {
printf("Failed to open file: %s\n", argv[1]);
return 1;
BITMAPFILEHEADER file_header = read_file_header(fp);
BITMAPINFOHEADER info_header = read_info_header(fp);
printf("Image size: %dx%d\n", info_header.biWidth, info_header.biHeight);
unsigned char* pixels = read_pixels(fp, info_header);
// 在这里,灰度值数组已经读取完毕,可以进行后续处理了
// ...
free(pixels);
fclose(fp);
return 0;
注意,上面的程序只能处理24位真彩色位图,对于其他格式的bmp文件可能会出错,需要进行适当的修改。同时,需要注意读取像素数据时跳过的填充字节,以及灰度值的计算方法。