open函数:
int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode)
注:第一个参数pathname 指向欲打开的文件路径字符串
第二个参数 flags 指文件打开方式(O_RDonLY|O_WRonLY|O_RDWR|O_APPEND|O_CREAT|O_NonBLOCK|O_TRUNC…)
第三个参数mode,只有flags为O_CREAT创建新文件才会使用参数mode。创建文件权限应该为 mode&~umaks
read函数:
ssize_t read(int fd, void *buf, size_t count);
注:第一个参数fd是文件指针
第二个参数buf是读上来的数据保存在缓冲区buf
第三个参数buf是读取的字节数;若参数count 为0, 则返回0;否则, 返回值为实际读取到的字节;失败,返回-1。
write函数:
ssize_t write (int fd, const void * buf, size_t count);
注:参数buf 所指的内容写入count 个字节到参数fd 所指的文件内;当然, 文件读写位置也会随之移动
close函数:
close(int fd);
fcntl函数:
fcntl用来操作文件状态
int flags = fcntl(fd, F_GETFL);
flags |= O_NONBLOCK;
fcntl(fd, F_SETFL, flags);
注:F_GETFL表示获取文件状态
F_SETFL表示设置文件状态
lseek函数:
off_t lseek(int fd,off_t offset,int whence);
注: offset表示偏移量
whence表示起始偏移位置(SEEK_SET/SEEK_CUR/SEEK_END)
应用场景:使用lseek获取文件大小,拓展文件大小
代码1:
#include#include #include #include main() { int fd,size; char s [ ]=”Linux Programmer!/n”,buffer[80]; fd=open(“/tmp/temp”,O_WRONLY|O_CREAT);//创建文件名temp write(fd,s,sizeof(s));//向文件temp写内容 close(fd); fd=open(“/tmp/temp”,O_RDONLY); size=read(fd, buffer,sizeof(buffer));//读文件temp,存放到buffer里 close(fd); printf(“%s”,buffer); }
代码2:
#include2.C语言库函数文件读写#include #include #include int display_file(int,int); int main(int argc, char*argv[]) { int fd = 0; fd=open("./open_1.c",O_RDONLY); //printf("fd = %d rn", fd); display_file(fd, 1024); return 0 ; } int display_file(int fd, int count) { char buffer[100]; memset(buffer, 0, sizeof(buffer)); if(0 > fd || 0 >= count) return -1; int read_num = read(fd,buffer,count); if (read_num < 0) return -1; else return read_num; fprintf(stdout,"buffer= %s read_num = %d ",buffer, read_num); }
fopen() 函数:
FILE *fopen(const char *filename, const char *mode)
注:第一个参数filename是文件路径
第二个参数mode是文件打开方式(文件使用方式由r,w,a,t,b,+六个字符拼成)
r(read): 读
w(write): 写
a(append): 追加
t(text): 文本文件,可省略不写
b(banary): 二进制文件
+: 读和写
返回值: 文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno中。
fwrite()函数:
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* fd);
注:第一个参数buffer是指向数据块的指针
第二个参数size是每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
第三个参数fd是文件描述符
(1) 调用格式:fwrite(buf, sizeof(buf), 1, fd);
成功写入返回值为1(即count)
(2)调用格式:fwrite(buf, 1, sizeof(buf), fd);
成功写入则返回实际写入的数据个数(单位为Byte)
fread()函数:
size_t fread(void *buffer, size_t size, size_t count, FILE *fd);
注:第一个参数buffer是指向数据块的指针
第二个参数size是每个数据的大小,单位为Byte(例如:sizeof(int)就是4)
第三个参数fd是文件描述符
(1) 调用格式:fread(buf, sizeof(buf), 1, fd);
读取成功时:当读取的数据量正好是sizeof(buf)个Byte时,返回值为1(即count)
否则返回值为0(读取数据量小于sizeof(buf))
(2)调用格式:fread(buf, 1, sizeof(buf), fd);
读取成功返回值为实际读回的数据个数(单位为Byte)
fclose()函数:
close(fd);
注:写完数据后要调用fclose()关闭流,不关闭流的情况下,每次读或写数据后,文件指针都会指向下一个待写或者读数据位置的指针
代码1:
#include "stdafx.h" #define _CRT_SECURE_NO_WARNINGS #include#include #define DATA_SIZE 1024 int main() { unsigned char *dataPtr = NULL; dataPtr = (unsigned char *)malloc(sizeof(int)*DATA_SIZE); //申请的区域是4096个char,即1024个字的区域 for(unsigned int i=0;i fprintf()、fputs()和fputc()函数:(文件的顺序写函数)
int fprintf(FILE *stream, char *format, );
int fputs(char *string, FILE *fd);
int fputc(int ch, FILE *fd);代码2:
#includemain() { char *s="That's good news"; int i=618; FILE *fd; fd=fopen("example.dat", "w"); fputs("Hello world", fd); fputc(':', fd); fprintf(fd, "%dn", i); fprintf(fd, "%s", s); fclose(fd); } fscanf()、fgets()和fgetc()函数函数:(文件的顺序读函数)
int fprintf(FILE *stream, char *format, );
int fputs(char *string, FILE *fd);
int fputc(int ch, FILE *fd);
注:(1) fscanf()函数的用法与scanf()函数相似, 只是它是从文件中读到信息。 fscanf()函数的返回值为EOF(即-1), 表明读错误, 否则读数据成功。
(2) fgets()函数从文件中读取至多n-1个字符(n用来指定字符数), 并把它们放入string指向的字符串中, 在读入之后自动向字符串未尾加一个空字符, 读成功返回string指针, 失败返回一个空指针。
(3) fgetc()函数返回文件当前位置的一个字符, 读错误时返回EOF。代码3:
#includemain() { char *s, m[20]; int i = 2020; FILE *fd; fd=fopen("example.dat", "r"); fgets(s, 24, fd); printf("%s", s); fscanf(fd, "%d", &i); printf("%d", i); putchar(fgetc(fd)); fgets(m, 17, fd); puts(m); fclose(fd); } fflush()、feof()和rewind()函数:
当用标准文件函数对文件进行读写操作时, 首先将所读写的内容放进缓冲区, 即写函数只对输出缓冲区进行操作, 读函数只对输入缓冲区进行操作。例如向一个文件写入内容, 所写的内容将首先放在输出缓冲区中, 直到输出缓冲区存满或使用fclose()函数关闭文件时, 缓冲区的内容才会写入文件中。若无fclose() 函数, 则不会向文件中存入所写的内容或写入的文件内容不全。有一个对缓冲区进行刷新的函数
int fflush(FILE *stream);这两个函数的调用格式为:
int feof(FILE *stream);
int rewind(FILE *stream);注:(1) fflush()函数是一个对缓冲区进行刷新的函数,该函数将输出缓冲区的内容实际写入文件中, 而将输入缓冲区的内容清除掉。
(2) feof()函数检测文件位置指示器是否到达了文件结尾, 若是则返回一个非0 值, 否则返回0。这个函数对二进制文件操作特别有用, 因为二进制文件中, 文件结尾标志EOF也是一个合法的二进制数, 只简单的检查读入字符的值来判断文件是否结束是不行的。如果那样的话, 可能会造成文件未结尾而被认为结尾, 所以就必须有feof()函数。
下面的这条语句是常用的判断文件是否结束的方法。while(!feof(fp))
fgetc(fp);(3)rewind()函数用于把文件位置指示器移到文件的起点处, 成功时返回0, 否则, 返回非0值。
3.c++ 风格fstream的读写文件fstream提供三种类,实现C++对文件的操作:
ofstream:写操作,由ostream引申而来
ifstream:读操作,由istream引申而来
fstream :同时读写操作,由iostream引申而来文件的打开类型:
ios::in 为输入(读)而打开文件;
ios::out 为输出(写)而打开文件;
ios::ate 初始位置:文件尾;
ios::app 所有输出附加在文件末尾;
ios::trunc 如果文件已存在则先删除该文件;
ios::binary 二进制方式;
ios::nocreate:不建立文件,所以文件不存在时打开失败;
ios::noreplace:不覆盖文件,所以打开文件时如果文件存在失败;例如,如果我们想要以二进制方式打开文件"example.bin" 来写入一些数据,我们可以通过以下方式调用成员函数open()来实现:
第一种方法:ofstream file; file.open ("example.bin", ios::out | ios::app | ios::binary);第二种方法:
ofstream file ("example.bin", ios::out | ios::app | ios::binary);通过调用成员函数is_open()来检查一个文件是否已经被顺利的打开了:
bool is_open();它返回一个布尔(bool)值,为真(true)代表文件已经被顺利打开,假(false)则相反。
文件指针位置的用法:
ios::beg 文件头
ios::end 文件尾
ios::cur 当前位置
例子:
file.seekg(0,ios::beg); //让文件指针定位到文件开头
file.seekg(0,ios::end); //让文件指针定位到文件末尾
file.seekg(10,ios::cur); //让文件指针从当前位置向文件末方向移动10个字节
file.seekg(-10,ios::cur); //让文件指针从当前位置向文件开始方向移动10个字节
file.seekg(10,ios::beg); //让文件指针定位到离文件开头10个字节的位置
注:移动的单位是字节,而不是行代码1:
#include#include #include using namespace std; //定义一个结构体 struct Game { int num; int year; string location; string first; string second; string third; }; int main() { string str[25][4]; int I[25][2] = {0}; ifstream myfile("data1.txt"); ofstream outfile("out.txt", ios::trunc); //定义一个结构数组 Game game[25]; //打开并读取data1.txt if (!myfile.is_open()) { cout << "can not open this file" << endl; return 0; } for (int i = 0; i < 25; i++) { for (int j = 0; j < 2; j++) { myfile >> I[i][j]; } } for (int i = 25; i < 50; i++) { for (int j = 0; j < 4; j++) { myfile >> str[i-25][j]; } } //初始化结构数组元素 for (int i = 0; i < 25; i++) { game[i].num = I[i][0]; game[i].year = I[i][1]; game[i].location = str[i][0]; game[i].first = str[i][1]; game[i].second = str[i][2]; game[i].third = str[i][3]; //写入outfile对象并控制台输出结果 outfile << game[i].num << " " << game[i].year << " " << game[i].location << " " << game[i].first << " " << game[i].second << " " << game[i].third << endl; cout << game[i].num << " " << game[i].year << " " << game[i].location << " " << game[i].first << " " < 4.fstream附 使用运算符<<(写)和getline()函数进行读:
<<:以行为单位输入文件
getline():以行为单位读入内存,能一次读入一行
istream &getline( char *buffer, streamsize num );
注:getline( )函数用于从文件读取num-1个字符到buffer(内存)中,直到下列情况发生时,读取结束:
(1):num - 1个字符已经读入
(2):碰到一个换行标志
(3):碰到一个EOF代码1:
#include#include using namespace std; void main() { const int len=20; char str[len]; ifstream OpenFile("file.txt"); if (OpenFile.fail()) { cout<<"打开文件错误!"< get( )和put( )函数:
istream& get(char &ch);
ofstream &put(char ch);
注:使用运算符get( ) 和 put( )读写一个字节
get( ) :在文件中读取一个字节到内存
put( ) :在内存中写入一个字节到文件#include#include using namespace std; ===================================get()======================================== void main() { char ch; ifstream OpenFile("file.txt"); if (OpenFile.fail()) { cout<<"打开文件错误!"<



