C 文件读取
二进制读取
#include<stdio.h>
int main()
{
FILE *fpRead = fopen("data/data.in","rb");
FILE *fpWrite = fopen("data/data.o","wb");
unsigned char buf[1000];
int rc;
while((rc = fread(buf,sizeof(unsigned char), 1, fpRead))!=0)
{ // 1. 一次读写一个字节,也可以一次读写n个字节,但rc总小于等于n,表示实际读取的字节数
// 2. fread 函数遇到'\0'后会停止读入,返回rc,并buf余下的位置会补0,因此不用担心会报错的情况
// 3. 在写入的时候也要给出写入多少个(rc),每一个数据有多少位(sizeof(typ)
fwrite( buf, sizeof(unsigned char), rc, fpWrite );
for(int i = 0; i < rc; i++)
{
printf("%x, ",buf[i]);
}
}
printf("\n");
fclose(fpRead);
fclose(fpWrite);
return 0;
}
data.in文件:按照一个字节一个字节输出(以十六进制的形式,读入时候读的是ASCII码)
fopen() 函数参数
FILE *fp = fopen("D:\\1.txt","rb+");
// 以二进制的形式打开文件1.txt, 如果文件不存在则返回NULL。文件以读写方式打开,可以用fp指针修改或者读取。
- r 只读方式
- w 只写方式, 如果文件不存在则新建一个文件,如果文件存在,则清空文件重写
- r+ 可读可写,如果文件不存在则返回NULL
- w+ 可读可写,如果文件不存在则新建文件
- a 追加方式,如果文件不存在则新建文件,如果文件存在则在末尾追加写入的数据
- a+ 可读可写,写入的数据追加至末尾,如果文件不存在则新建文件
后面默认为t,以文件格式读写;
如果加上b,则以二进制文件读写(最小单位为字节,unsigned char)
fread() 函数参数
size_t fread(void *buf, size_t size, size_t num, FILE *stream)
- buf 指向带有最小尺寸 size*nmemb 字节的内存块的指针, 用来存读入的数据
- size 每个元素大小,以字节为单位
- num 一次读取的元素个数
- stream 指向FILE对象的指针,由fopen函数生成
rc = fread(buf,sizeof(unsigned char), 10, fpRead))
buf一次存入10个字节的数据,也可能由于文件缺失,只读了一部分,rc记录读入的元素个数,如果rc==0,说明读入完成。
fscanf() 函数参数
int fscanf(FILE * stream, const char * format, [argument...])
- stream 指向FILE对象的指针,输入流(跟cin类似,指键盘上输入)fin则从文件输入,由fopen创建。
- format 一次读入文件的格式,例如"%s %s %s %d"
- [argument...] 读取的数据保存的位置, s0,s1,s2,&num
返回读入参数的个数,读取失败则返回EOF(-1)
按结构体读取文件
#include<stdio.h>
typedef struct Student{
int age;
char name[10];
int gender;
}Stu;
int main()
{
FILE *fpRead = fopen("data/data.in","r");//将data.in文件存在data文件夹下
FILE *fpWrite = fopen("data/data.o","w");
Stu buf[1000]; //定义缓存区
int j = 0;
while((fscanf(fpRead,"%d,%d,%s",&buf[j].age,&buf[j].gender,buf[j].name))!=EOF) //结构化数据输入
{
printf("age:%d name:%s gender:%s\n",buf[j].age,buf[j].name,buf[j].gender?"男":"女");
fprintf(fpWrite,"age:%d name:%s gender:%s\n",buf[j].age,buf[j].name,buf[j].gender?"男":"女"); //结构化数据输出
j++;
}
printf("\n");
fclose(fpRead);
fclose(fpWrite);
return 0;
}
读取的文件
12,1,Tom
14,0,Sara
12,1,Jack
18,0,Kate
输出:
其他输入输出函数(C语言)
fgetc fputc
int __cdecl fgetc(FILE *_File); //成功则返回获得的值,不成功则返回EOF
int __cdecl fputc(int _Ch,FILE *_File); //成功则返回_ch, 不成功则返回EOF=-1
fgets fputs
int __cdecl fputs(const char * __restrict__ _Str,FILE * __restrict__ _File); //若成功返回非负值,若失败返回EOF
char *__cdecl fgets(char * __restrict__ _Buf,int _MaxCount,FILE * __restrict__ _File); 如果成功返回一个指针;若出错返回null,需要定义_MaxCount一次最多获得多少个字节
输入输出重定向,也可以解决大部分问题
实例:代码如下: 将in.txt中的输入两两相乘然后输出到out.txt文件中
c写法:
#include <stdio.h>
int main()
{
int a, b;
freopen("in.txt", "r", stdin); //输入重定向,输入数据将从in.txt文件中读取
freopen("out.txt", "w", stdout); //输出重定向,输出数据将保存在out.txt文件中
while (scanf("%d %d",&a,&b)!=EOF)
{
printf("%d ",a*b);
}
fclose(stdin); //关闭文件
fclose(stdout); //关闭文件
return 0;
}
也可以简单写如下代码:
test.c文件:
#include <stdio.h>
int main()
{
int a, b;
while (scanf("%d %d",&a,&b)!=EOF)
{
printf("%d ",a*b);
}
return 0;
}
在命令行输入
g++ -o test test.c
test.exe <in.txt> out.txt
在命令行指定输入输出文件也可以实现上面的功能
C++写法
#include<fstream>
using namespace std;
int main()
{
int a, b;
ifstream inFile("in.txt");
ofstream outFile("out.txt");
while (inFile >> a >> b)
{
outFile << a + b << endl;
}
inFile.close();
outFile.close();
return 0;
}