全网最详细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++文件读写总结的主要内容,如果未能解决你的问题,请参考以下文章

全网最详细C/C++文件读写总结

总结全网最详细的Python库总结

C语言 文件读写 ftell 函数

全网最详细的一篇SpringCloud总结

全网最详细的一篇Flutter 尺寸限制类容器总结

全网总结最详细的MPLS技术⭐建议收藏⭐