C/C++中的文件操作(1)

前几天一直用Python做google code jam的练习题,文件操作很方便。如果用C/C++去做的话,那么首先要解决的就是文件操作。于是整理了一下文件操作的函数用法。先来看看C的文件操作。

FILE* stream
相关的头文件stdio.h,就可以使用与文件操作相关的数据类型和函数。
文件的打开与关闭
首先,定义文件指针,FILE* f,用fopen(const char* filename,const char* mode)来打开文件,用fclose(File* p)来关闭文件。
文件的打开方式,"r"表示读,"w"表示写,"a"表示在文件末尾追加,然后加上"+"就表示既可以读又可以写。
文件还可以按text或binary的模式打开,可以在mode里面加上"t"或"b"。默认情况下是按text模式打开。
需要注意的是,对于"r"模式,文件必须存在,否则返回值NULL;而对于"w"和"a",如果文件不存在,则会创建新的文件。

文件内容的读取与输出内容到文件
int feof(File* p) 判断是否到文件尾,否的情况下才能继续往下读。
int fgetc(FILE* p) 读取一个字符,返回值是int,对应的ascii值。
char* fgets(char* str,int num, FILE* p) 读取指定数目为num的字符到str中。这个函数有返回值,如果读取成功,返回值与str地址一样,不成功则为NULL,所以读取之后还是先判断一下返回值是否为NULL。
size_t fread(void* ptr,size_t size,size_t count,FILE* p) 竟然有四个参数,ptr指向的空间用来存放读到的内容,size表示读取的单元的byte数,count表示要读取的单元数,返回值表示实际读到的单元数。

获得文件的长度
// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);

int fscanf(FILE* p,const char* format,...) format,与printf相同的一个参数,
[=%[*][width][modifiers]type]
* 表示
width 读取一次的长度
modifiers可以是
h,表示short int或short unsigned int;
l表示long int或long unsigned int或double,
L表示long double。
type表示值的类型,可以用的类型有
%c 读取单个字符, char c;fscanf(p,"%c",&c);
%d 读取整数,可以处理前面的+-,int d;fscanf(p,"%d",&d);
%e或%E 读取浮点数,可以处理科学记数法,float f;fscanf(p,"%e",&f);
%f 读取浮点数 float f;fscanf(p,"%f",&f);
%g或%G 读取浮点数 float f;fscanf(p,"%g",&f);
%s 读取字符串 char str[80];fscanf(p,"%s",str); 限定width,避免溢出
%u 读取无符号数 unsigned int u;fscanf(p,"%u",&u);
%o 读取8进制数 int o;fscanf(p,"%o",&o);
%x或%X 读取16进制数 int x;fscanf(p,"%x",&x);

输出内容到文件
int fputc(int c,FILE* p) 写一个字符到文件,第一个参数是int类型;
int fputs(const char* str,FILE* p) 将字符串str写到文件,与fgtes不同的是,不需要指定长度;
size_t fwrite(const void* ptr,size_t size,size_t count,FILE* p) 与fread对应,返回值为成功写入的元素数,应该与count相等,否则就是出错了。
int fprintf(FILE*p,const char* format,...)与printf对应的,将内容打印到文件。这里的format与fscanf的format有些不同,
%[flags][width][.precision][length]specifier
flags,
- 要求输出左对齐,默认是右对齐
+ 对正数也输出符号+
空格 在没有符号的时候输出空白,对于正数,不输出+则输出空格,在有+的flag时空格会忽略掉。
# 在16或8进制输出时在前面加上0x
0 空白处填充0
width,
number 用一个数字表示输出的元素所占位宽
precision,
.number 用一个数字表示需要输出几位小数
length,
h,l,L与fscanf类似,l在用于wchar_t字符或字符串输出时
specifier,
与fscanf相比,多了一个p,输出地址,%,两个%一起才表示输出一个%。

输入输出重定向
可以把标准输入输出重定向到文件,
比如一般从stdin读取输入,用的读取函数是gets,read,scanf等,当想从文件读取输入的时候,不是将这些函数变成fgets,fread,fscanf,而是使用输入输出重定向。
freopen(const char* filename,const char* mode, FILE* stream), 将stream重定向到filename对应的文件。失败则返回NULL。
重定向标准输入到文件,之后就是从文件读取输入了。
freopen("input.txt","r",stdin);
重定向标准输出到文件,之后就把内容输出到文件了。
freopen("output.txt","r",stdout);

error
void perror(const char* str),报错,输出给定的错误提示信息,并将全局的errno转换成对应错误信息输出。
int ferror(FILE* p), 检查文件是否处于异常状态。

接下来会继续整理C++的文件操作。

整理过程只是自己的学习过程。虽然简单,但也需要积累。

原文地址:https://www.cnblogs.com/Frandy/p/c_file_op.html