全网最详细C/C++文件读写总结
Posted 卷起来卷起来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全网最详细C/C++文件读写总结相关的知识,希望对你有一定的参考价值。
1.linux系统函数文件读写
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<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
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:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int display_file(int,int);
int main(int argc, char*argv[])
int fd = 0;
fd=open("./open_1.c",O_RDONLY);
//printf("fd = %d \\r\\n", 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);
2.C语言库函数文件读写
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 <stdio.h>
#include <stdlib.h>
#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<DATA_SIZE;i++)
dataPtr[i] = i; //初始化缓存区
FILE *fd = fopen("F:\\\\Labwindows cvi\\\\test.txt","ab+");
fwrite(dataPtr,sizeof(char),DATA_SIZE*sizeof(int),fp);
fclose(fp);
free(dataPtr);
system("pause");
return 0;
fprintf()、fputs()和fputc()函数:(文件的顺序写函数)
int fprintf(FILE *stream, char *format, );
int fputs(char *string, FILE *fd);
int fputc(int ch, FILE *fd);
代码2:
#include<stdio.h>
main()
char *s="That's good news"; /*定义字符串指针并初始化*/
int i=618; /*定义整型变量并初始化*/
FILE *fd; /*定义文件指针*/
fd=fopen("example.dat", "w"); /*建立一个文字文件只写*/
fputs("Hello world", fd);/*向所建文件写入一串字符*/
fputc(':', fd); /*向所建文件写冒号:*/
fprintf(fd, "%d\\n", 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:
#include<stdio.h>
main()
char *s, m[20];
int i = 2020;
FILE *fd;
fd=fopen("example.dat", "r"); /*打开文字文件只读*/
fgets(s, 24, fd); /*从文件中读取23个字符*/
printf("%s", s); /*输出所读的字符串*/
fscanf(fd, "%d", &i); /*读取整型数*/
printf("%d", i); /*输出所读整型数*/
putchar(fgetc(fd)); /*读取一个字符同时输出*/
fgets(m, 17, fd); /*读取16个字符*/
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 <iostream>
#include <fstream>
#include <string>
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 << " "
<<game[i].second<<" "<<game[i].third<<endl;
;
myfile.close();
outfile.close();
return 0;
4.fstream附
使用运算符<<(写)和getline()函数进行读:
<<:以行为单位输入文件
getline():以行为单位读入内存,能一次读入一行
istream &getline( char *buffer, streamsize num );
注:getline( )函数用于从文件读取num-1个字符到buffer(内存)中,直到下列情况发生时,读取结束:
(1):num - 1个字符已经读入
(2):碰到一个换行标志
(3):碰到一个EOF
代码1:
#include <fstream>
#include <iostream>
using namespace std;
void main()
const int len=20;
char str[len];
ifstream OpenFile("file.txt");
if (OpenFile.fail())
cout<<"打开文件错误!"<<endl;
exit(0);
OpenFile.getline(str,20);
cout<<str<<endl;
OpenFile.close();
system("pause");
get( )和put( )函数:
istream& get(char &ch);
ofstream &put(char ch);
注:使用运算符get( ) 和 put( )读写一个字节
get( ) :在文件中读取一个字节到内存
put( ) :在内存中写入一个字节到文件
#include <fstream>
#include <iostream>
using namespace std;
===================================get()========================================
void main()
char ch;
ifstream OpenFile("file.txt");
if (OpenFile.fail())
cout<<"打开文件错误!"<<endl;
exit(0);
OpenFile.get(ch);
cout<<ch;
OpenFile.close();
system("pause");
===================================put()========================================
void main()
char ch='1';
ofstream OpenFile("file.txt");
if (OpenFile.fail())
cout<<"打开文件错误!"<<endl;
exit(0);
OpenFile.put(ch);
OpenFile.close();
system("pause");
以上是关于全网最详细C/C++文件读写总结的主要内容,如果未能解决你的问题,请参考以下文章