文件读写_文件读写操作 - CSDN
精华内容
参与话题
  • C语言 文件读写的实现

    千次阅读 2019-04-26 11:56:39
    关于C语言的文件读写,我将介绍下面这几种方式: 字符的读写:使用 fgetc() 函数 和 fputc() 函数; 字符串的读写:使用 fgets() 函数和 fputs() 函数; 格式化的读写(主要用于文本文件):使用 ...

    关于C语言的文件读写,我将介绍下面这几种方式:

    • 字符的读写:使用 fgetc() 函数 和 fputc() 函数;

    • 字符串的读写:使用 fgets() 函数和 fputs() 函数;

    • 格式化的读写(主要用于文本文件):使用 fscanf() 函数和 fprintf() 函数。

    字符读写:

    1. fputc()函数

    fputc(c,fp);   //用于将一个字符写入文件
    

    其中,fp为文件指针变量;c为要写入的字符,可以是字符常量或字符型变量。函数返回值:如果执行成功,返回写入的字符;否则,返回EOF。

    int main()
    {
    	FILE *fp;           //定义文件指针
    	char ch;            //字符指针
    	fp=fopen("C://Users//Administrator//Desktop//tcc//trans//in.txt","w"); //打开文件,写入模式
    	if(fp==NULL)        //若fopen()函数返回NULL则打开文件失败
    	{
    		printf("文件打开失败\n");
    	}
    	else
    	{
    		printf("请输入内容(以回车结束):\n");        
    		while((ch = getchar()) != '\n')  //读取字符进行写入,读取到“\n”结束
    		{
    			fputc(ch,fp);
    		}
    	}
    	fclose(fp);   //关闭文件
    	return 0;
    }
    

    由于没有写循环,目前只能输入一行文本内容。

    2. fgetc()函数

     c=fgetc(fp);    //用来从指定的文本文件中读取一个字符。
    

    其中,fp为文件指针,c为要写入的字符。该函数的功能是从指定的文件中读取一个字符,并赋值给字符型变量c。

    函数返回值:读取成功,返回读取字符;读取错误或遇到结束标志EOF,返回EOF。

    int main()
    {
    	FILE *fp;           //定义文件指针
    	char ch;            //字符指针
    	fp=fopen("C://Users//Administrator//Desktop//tcc//trans//in.txt","r"); //打开文件,只读模式
    	if(fp==NULL)        //若fopen()函数返回NULL则打开文件失败
    	{
    		printf("文件打开失败\n");
    	}
    	else
    	{
    		while((ch=fgetc(fp))!=EOF)    //读取文件字符,直到返回fgetc()函数返回EOF
    		{
    			 putchar(ch);             //在显示窗口输出字符
    		}
    		putchar('\n');                //输出回车
    	}
    	fclose(fp);
    	return 0;
    }
    

    字符串读写

    1. fputs()函数

    fputs(s,fp);     //用来将一个字符串写入指定的文本文件。 
    

    其中,fp为文件指针,s可以是字符数组名,字符型指针变量或字符串常量。该函数的功能是将字符串s写入由fp指向的文件中,字符串末尾的‘\0’字符不允写入。

    函数返回值:执行成功,返回所写的最后一个字符;否则,返回EOF。

    int main()
    {
    	FILE *fp;           //定义文件指针
    	char s[][100]={"a 一","b 地","c 现","cd 三","about 关于"};            //将字符串存入数组
    	int i;
    	fp=fopen("C://Users//Administrator//Desktop//tcc//trans//in.txt","w"); //打开文件,写入模式
    	if(fp==NULL)        //若fopen()函数返回NULL则打开文件失败
    	{
    		printf("文件打开失败\n");
    	}
    	else
    	{
    		for(i=0;i<5;i++)         //注意数组从0开始
    		{
                fputs(s[i],fp);      //在文件中写入数组中的字符串
                fputs("\n",fp);      //在文件中写入回车
    		}
        }
    	fclose(fp);   //关闭文件
    	return 0;
    }
    

    运行结果:
    在这里插入图片描述
    2. fgets()函数

    fgets(s,n,fp);     //用于从指定的文件中读一个字符串到字符数组中。
    

    其中,s可以是字符型数组名或字符串指针;n是指定读入的字符个数;fp为文件指针。n是一个正整数,表示从文件中最多读取n-1个字符,并将字符串指针s定位在读入的字符串首地址。

    fgets()函数从文件中读取字符直到遇到回车符或EOF为止,函数会在最后一个字符后加上字符串结束标志’\0’;若有EOF,则不予保留。

    函数返回值:该函数如果执行成功,返回读取字符串;如果失败,则返回空指针NULL,这时,s中的内容不确定。

    int main()
    {
    	FILE *fp;           //定义文件指针
    	char s[5][100];     
    	int i;
    	fp=fopen("C://Users//Administrator//Desktop//tcc//trans//in.txt","r"); //打开文件,只读模式
    	if(fp==NULL)        //若fopen()函数返回NULL则打开文件失败
    	{
    		printf("文件打开失败\n");
    	}
    	else
    	{
    		for(i=0;i<5;i++)
    		{
    			fgets(s[i],100,fp);    //读取字符串存入数组
    			printf("%s",s[i]);     //输出字符串
    		}
    	}
    	fclose(fp);
    	return 0;
    }
    

    运行结果:
    在这里插入图片描述

    格式化读写

    1. fprintf()函数

    fprintf(fp,format, arg1, arg2,….,argn);
    

    fprintf()用来将输出项按指定的格式写入指定的文本文件中,其中格式化规定与printf()函数功能相似,所不同的只是fprintf()函数是将输出的内容写入文件中,而printf()函数则是在屏幕输出。

    其中,fp为文件指针,format为指定的格式控制字符串;arg1~argn为输出项,可以是字符、 字符串或各种类型的数值。该函数的功能是按格式控制字符串format给定的格式,将输出项arg1,arg2,……,argn的值写入fp所指向的文件中。

    函数返回值:如果函数执行成功,返回实际写入文件的字符个数;若出现错误,返回负数。

    具体格式:

    fprintf(fp,"%s",s[i]);      //在文件中写入数组中的字符串
    

    2. fscanf()函数

    fscanf(fp,format,arg1,arg2,…..,argn);
    

    fscanf()用来按规定的格式从指定的文本文件中读取数据。它与scanf()函数的功能相似,都是按规定的格式读数据的函数,只是fscanf()函数读的对象不是键盘区,而是文件。

    其中,fp为文件指针,format为指定的格式控制字符串;arg1~argn为输入项的地址。该函数的功能是从文件指针fp所指的文本文件中读取数据,按格式控制字符串format给定的格式赋予输入项arg1,arg2,……,argn中。

    函数返回值:如果该函数执行成功,返回读取项目个数;如果遇到文件末尾,返回EOF;如果赋值失败,返回0.

    具体格式:

    fscanf(fp,"%s",s[i]);    //读取字符串存入数组
    
    展开全文
  • C++实现对文件读写操作(详细)

    万次阅读 多人点赞 2018-08-30 16:52:08
    上一次用到了从c++中输出文本文档,用到了头文件fstream,下面详细介绍一下...fstream—打开文件读写。 对于这三个类的公共函数可以参考c++ reference。先介绍一部分: ios::beg 文件头 ios::end 文件尾 ...

    上一次用到了从c++中输出文本文档,用到了头文件fstream,下面详细介绍一下头文件fstream。

    fstream包含三个类,分别是:

    ifstream—从已有的文件中读。

    ofstream—从已有的文件中写。

    fstream—打开文件供读写。

    对于这三个类的公共函数可以参考c++ reference。先介绍一部分:

    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个字节的位置

    常用的判断错误的方法:

    good()   如果文件打开成功
    bad()   打开文件时发生错误
    eof()    到达文件尾

    读取文件:对于程序来说,从外部读取数据吗,因此要定义输入流,即定义输入流对象,这个对象中存放从文件中读入的输入流。

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    #include <sstream>
    #include <algorithm>
    using namespace std;
    
    int main()
    {
    ifstream infile;
    string t1;
    string t2;
    vector<string> id;
    vector<string> time;
    
    
    infile.open("C:\\Users\\CiCi\\Desktop\\数学建模\\id.txt");
    	if (!infile.is_open())
    		cout << "open file failure" << endl;
    	while (!infile.eof())
    	{
    		infile >> t1;
    		id.push_back(t1);
    	}
    	infile.close();
    	infile.open("C:\\Users\\CiCi\\Desktop\\数学建模\\time.txt");
    	if (!infile.is_open())
    		cout << "open file failure" << endl;
    	while (!infile.eof())
    	{
    		infile >> t2;
    		time.push_back(t2);
    	}
    	infile.close();
    
    for (auto it = id.begin(); it != id.end(); it++)
    	{
    		id_index.push_back(it - id.begin());
    	}
    	for (auto it = time.begin(); it != time.end(); it++)
    	{
    		time_index.push_back(it - time.begin());
    	}
    	for (auto it = time.begin(); it != time.end(); it++)
    	{
    		string t = *it;
    		if (t.substr(2, 1) != ":")
    		{
    
    			time_h.push_back(atoi(t.substr(0, 1).c_str()));
    			time_m.push_back(atoi(t.substr(2, 2).c_str()));
    		}
    		else
    		{
    			time_h.push_back(atoi(t.substr(0, 2).c_str()));
    			time_m.push_back(atoi(t.substr(3, 2).c_str()));
    		}
    	}
    	for (auto it = time_h.begin(); it != time_h.end(); it++)
    	{
    		auto t3 = time_h.at(it - time_h.begin()) * 60 + time_m.at(it - time_h.begin());
    		time_t.push_back(t3);
    	}
    
    return 0;
    
    }

    PS:这里介绍一个把string型的对象转换为int型的函数atoi。

    int atoi(const char*str);

    由于所需要的参数是c风格的字符串,所以还需要把string对象转换为c中的字符串样式。在c语言中没有string类型,故必须通过string类对象的成员函数c_str()来实现。

    time_h.push_back(atoi(t.substr(0, 2).c_str()));

     

    展开全文
  • C语言文件读写

    千次阅读 2018-12-08 12:47:22
    在C语言中提供了多种文件读写的函数: 字符读写函数&amp;amp;nbsp; :fgetc和fputc 字符串读写函数:fgets和fputs 数据块读写函数:freed和fwrite 格式化读写函数:fscanf和fprinf 下面分别予以介绍。...

    对文件的读和写是最常用的文件操作。在C语言中提供了多种文件读写的函数:

    1. 字符读写函数  :fgetc和fputc
    2. 字符串读写函数:fgets和fputs
    3. 数据块读写函数:freed和fwrite
    4. 格式化读写函数:fscanf和fprinf

    下面分别予以介绍。使用以上函数都要求包含头文件stdio.h。

    字符读写函数fgetc和fputc

    字符读写函数是以字符(字节)为单位的读写函数。 每次可从文件读出或向文件写入一个字符。

    1) 读字符函数fgetc
    fgetc函数的功能是从指定的文件中读一个字符,函数调用的形式为:
        字符变量=fgetc(文件指针);
    例如:
        ch=fgetc(fp);
    其意义是从打开的文件fp中读取一个字符并送入ch中。

    对于fgetc函数的使用有以下几点说明:

    • 在fgetc函数调用中,读取的文件必须是以读或读写方式打开的。
    • 读取字符的结果也可以不向字符变量赋值。例如:fgetc(fp);    但是读出的字符不能保存。
    • 在文件内部有一个位置指针。用来指向文件的当前读写字节。在文件打开时,该指针总是指向文件的第一个字节。使用fgetc 函数后,该位置指针将向后移动一个字节。 因此可连续多次使用fgetc函数,读取多个字符。应注意文件指针和文件内部的位置指针不是一回事。文件指针是指向整个文件的,须在程序中定义说明,只要不重新赋值,文件指针的值是不变的。文件内部的位置指针用以指示文件内部的当前读写位置,每读写一次,该指针均向后移动,它不需在程序中定义说明,而是由系统自动设置的。


    【例13-1】读入文件c1.doc,在屏幕上输出。

    #include<stdio.h>
    main(){
    	FILE *fp;
    	char ch;
    	if((fp=fopen("d:\\jrzh\\example\\c1.txt","rt"))==NULL){
    	printf("\nCannot open file strike any key exit!");
    	getch();
    	exit(1);
    	}
    	ch=fgetc(fp);
    	while(ch!=EOF){
    	putchar(ch);
    	ch=fgetc(fp);
    	}
    	fclose(fp);
    }
    

    本例程序的功能是从文件中逐个读取字符,在屏幕上显示。程序定义了文件指针fp,以读文本文件方式打开文件“d:\jrzh\example\ex1_1.c”,并使fp指向该文件。如打开文件出错,给出提示并退出程序。程序第10行先读出一个字符,然后进入循环,只要读出的字符不是文件结束标志(每个文件末有一结束标志EOF)就把该字符显示在屏幕上,再读入下一字符。每读一次,文件内部的位置指针向后移动一个字符,文件结束时,该指针指向EOF。执行本程序将显示整个文件。

    2) 写字符函数fputc
    fputc函数的功能是把一个字符写入指定的文件中。函数调用的形式为:
        fputc( 字符量, 文件指针 );
    其中,待写入的字符量可以是字符常量或变量,例如:
        fputc(‘a’,fp);
    其意义是把字符a写入fp所指向的文件中。

    对于fputc函数的使用也要说明几点:

    • 被写入的文件可以用写、读写、追加方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容,写入字符从文件首开始。如需保留原有文件内容,希望写入的字符以文件末开始存放,必须以追加方式打开文件。被写入的文件若不存在,则创建该文件。
    • 每写入一个字符,文件内部位置指针向后移动一个字节。
    • fputc函数有一个返回值,如写入成功则返回写入的字符,否则返回一个EOF。可用此来判断写入是否成功。


    【例13-2】从键盘输入一行字符,写入一个文件,再把该文件内容读出显示在屏幕上。

    #include<stdio.h>
    main(){
    	FILE *fp;
    	char ch;
    	if((fp=fopen("d:\\jrzh\\example\\string","wt+"))==NULL){
    	printf("Cannot open file strike any key exit!");
    	getch();
    	exit(1);
    	}
    	printf("input a string:\n");
    	ch=getchar();
    	while (ch!='\n'){
    	fputc(ch,fp);
    	ch=getchar();
    	}
    	rewind(fp);
    	ch=fgetc(fp);
    	while(ch!=EOF){
    	putchar(ch);
    	ch=fgetc(fp);
    	}
    	printf("\n");
    	fclose(fp);
    }
    

    程序中第5行以读写文本文件方式打开文件string。程序第11行从键盘读入一个字符后进入循环,当读入字符不为回车符时,则把该字符写入文件之中,然后继续从键盘读入下一字符。每输入一个字符,文件内部位置指针向后移动一个字节。写入完毕,该指针已指向文件末。如要把文件从头读出,须把指针移向文件头,程序第16行rewind函数用于把fp所指文件的内部位置指针移到文件头。第17至21行用于读出文件中的一行内容。

    【例13-3】把命令行参数中的前一个文件名标识的文件,复制到后一个文件名标识的文件中,如命令行中只有一个文件名则把该文件写到标准输出文件(显示器)中。

    #include<stdio.h>
    main(int argc,char *argv[]){
    	FILE *fp1,*fp2;
    	char ch;
    	if(argc==1){
    	printf("have not enter file name strike any key exit");
    	getch();
    	exit(0);
    	}
    	if((fp1=fopen(argv[1],"rt"))==NULL){
    	printf("Cannot open %s\n",argv[1]);
    	getch();
    	exit(1);
    	}
    	if(argc==2) fp2=stdout;
    	else if((fp2=fopen(argv[2],"wt+"))==NULL){
    	printf("Cannot open %s\n",argv[1]);
    	getch();
    	exit(1);
    	}
    	while((ch=fgetc(fp1))!=EOF)
    	fputc(ch,fp2);
    	fclose(fp1);
    	fclose(fp2);
    }
    

    本程序为带参的main函数。程序中定义了两个文件指针fp1和fp2,分别指向命令行参数中给出的文件。如命令行参数中没有给出文件名,则给出提示信息。程序第15行表示如果只给出一个文件名,则使fp2指向标准输出文件(即显示器)。程序第21行至24行用循环语句逐个读出文件1中的字符再送到文件2中。再次运行时,给出了一个文件名,故输出给标准输出文件stdout,即在显示器上显示文件内容。第三次运行,给出了二个文件名,因此把string中的内容读出,写入到OK之中。可用DOS命令type显示OK的内容。

    字符串读写函数fgets和fputs

    1) 读字符串函数fgets

    函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为:
        fgets(字符数组名,n,文件指针);
    其中的n是一个正整数。表示从文件中读出的字符串不超过 n-1个字符。在读入的最后一个字符后加上串结束标志’\0’。例如:
        fgets(str,n,fp);
    的意义是从fp所指的文件中读出n-1个字符送入字符数组str中。

    【例13-4】从string文件中读入一个含10个字符的字符串。

    #include<stdio.h>
    main(){
    	FILE *fp;
    	char str[11];
    	if((fp=fopen("d:\\jrzh\\example\\string","rt"))==NULL){
    	printf("\nCannot open file strike any key exit!");
    	getch();
    	exit(1);
    	}
    	fgets(str,11,fp);
    	printf("\n%s\n",str);
    	fclose(fp);
    }
    

    本例定义了一个字符数组str共11个字节,在以读文本文件方式打开文件string后,从中读出10个字符送入str数组,在数组最后一个单元内将加上’\0’,然后在屏幕上显示输出str数组。输出的十个字符正是【例13-1】程序的前十个字符。

    对fgets函数有两点说明:

    • 在读出n-1个字符之前,如遇到了换行符或EOF,则读出结束。
    • fgets函数也有返回值,其返回值是字符数组的首地址。

    2) 写字符串函数fputs

    fputs函数的功能是向指定的文件写入一个字符串,其调用形式为:
        fputs(字符串,文件指针);
    其中字符串可以是字符串常量,也可以是字符数组名,或指针变量,例如:
        fputs(“abcd“,fp);
    其意义是把字符串“abcd”写入fp所指的文件之中。

    【例13-5】在【例13-2】中建立的文件string中追加一个字符串。

    #include<stdio.h>
    main(){
    	FILE *fp;
    	char ch,st[20];
    	if((fp=fopen("string","at+"))==NULL){
    	printf("Cannot open file strike any key exit!");
    	getch();
    	exit(1);
    	}
    	printf("input a string:\n");
    	scanf("%s",st);
    	fputs(st,fp);
    	rewind(fp);
    	ch=fgetc(fp);
    	while(ch!=EOF){
    	putchar(ch);
    	ch=fgetc(fp);
    	}
    	printf("\n");
    	fclose(fp);
    }
    

    本例要求在string文件末加写字符串,因此,在程序第5行以追加读写文本文件的方式打开文件string。然后输入字符串,并用fputs函数把该串写入文件string。在程序15行用rewind函数把文件内部位置指针移到文件首。再进入循环逐个显示当前文件中的全部内容。

    数据块读写函数fread和fwrite

    C语言还提供了用于整块数据的读写函数。可用来读写一组数据,如一个数组元素,一个结构变量的值等。

    读数据块函数调用的一般形式为:
        fread(buffer,size,count,fp);
    写数据块函数调用的一般形式为:
        fwrite(buffer,size,count,fp);
    其中:

    • buffer:是一个指针,在fread函数中,它表示存放输入数据的首地址。在fwrite函数中,它表示存放输出数据的首地址。
    • size:表示数据块的字节数。
    • count:表示要读写的数据块块数。
    • fp:表示文件指针。


    例如:
        fread(fa,4,5,fp);
    其意义是从fp所指的文件中,每次读4个字节(一个实数)送入实数组fa中,连续读5次,即读5个实数到fa中。

    【例13-6】从键盘输入两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏幕上。

    #include<stdio.h>
    struct stu{
    	char name[10];
    	int num;
    	int age;
    	char addr[15];
    }boya[2],boyb[2],*pp,*qq;
    main(){
    	FILE *fp;
    	char ch;
    	int i;
    	pp=boya;
    	qq=boyb;
    	if((fp=fopen("d:\\jrzh\\example\\stu_list","wb+"))==NULL){
    	printf("Cannot open file strike any key exit!");
    	getch();
    	exit(1);
    	}
    	printf("\ninput data\n");
    	for(i=0;i<2;i++,pp++)
    	scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
    	pp=boya;
    	fwrite(pp,sizeof(struct stu),2,fp);
    	rewind(fp);
    	fread(qq,sizeof(struct stu),2,fp);
    	printf("\n\nname\tnumber age addr\n");
    	for(i=0;i<2;i++,qq++)
    	printf("%s\t%5d%7d %s\n",qq->name,qq->num,qq->age,qq->addr);
    	fclose(fp);
    }
    

    本例程序定义了一个结构stu,说明了两个结构数组boya和boyb以及两个结构指针变量pp和qq。pp指向boya,qq指向boyb。程序第14行以读写方式打开二进制文件“stu_list”,输入二个学生数据之后,写入该文件中,然后把文件内部位置指针移到文件首,读出两块学生数据后,在屏幕上显示。

    格式化读写函数fscanf和fprintf

    fscanf函数,fprintf函数与前面使用的scanf和printf 函数的功能相似,都是格式化读写函数。两者的区别在于fscanf函数和fprintf函数的读写对象不是键盘和显示器,而是磁盘文件。

    这两个函数的调用格式为:
        fscanf(文件指针,格式字符串,输入表列);
        fprintf(文件指针,格式字符串,输出表列);
    例如:
        fscanf(fp,"%d%s",&i,s);
        fprintf(fp,"%d%c",j,ch);
    用fscanf和fprintf函数也可以完成例10.6的问题。修改后的程序如【例10-7】所示。

    【例13-7】用fscanf和fprintf函数成【例10-6】的问题。

    #include<stdio.h>
    struct stu
    {
    	char name[10];
    	int num;
    	int age;
    	char addr[15];
    }boya[2],boyb[2],*pp,*qq;
    main(){
    	FILE *fp;
    	char ch;
    	int i;
    	pp=boya;
    	qq=boyb;
    	if((fp=fopen("stu_list","wb+"))==NULL){
    	printf("Cannot open file strike any key exit!");
    	getch();
    	exit(1);
    	}
    	printf("\ninput data\n");
    	for(i=0;i<2;i++,pp++)
    	scanf("%s%d%d%s",pp->name,&pp->num,&pp->age,pp->addr);
    	pp=boya;
    	for(i=0;i<2;i++,pp++)
    	fprintf(fp,"%s %d %d %s\n",pp->name,pp->num,pp->age,pp->addr);
    	rewind(fp);
    	for(i=0;i<2;i++,qq++)
    	fscanf(fp,"%s %d %d %s\n",qq->name,&qq->num,&qq->age,qq->addr);
    	printf("\n\nname\tnumber age addr\n");
    	qq=boyb;
    	for(i=0;i<2;i++,qq++)
    	printf("%s\t%5d %7d %s\n",qq->name,qq->num, qq->age,qq->addr);
    	fclose(fp);
    }
    

    与【例10-6】相比,本程序中fscanf和fprintf函数每次只能读写一个结构数组元素,因此采用了循环语句来读写全部数组元素。还要注意指针变量pp,qq由于循环改变了它们的值,因此在程序中对它们重新赋予了数组的首地址。

    展开全文
  • C语言文件读写操作总结

    万次阅读 多人点赞 2012-11-26 20:07:02
    C语言文件读写操作总结 C语言文件操作 一、标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此...

    C语言文件读写操作总结

    C语言文件操作

    一、标准文件的读写

    1.文件的打开

    fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写),如果该文件名不存在,就意味着建立(只对写文件而言,对读文件则出错),并将文件指针指向文件开头。若已有一个同名文件存在,则删除该文件,若无同名文件,则建立该文件,并将文件指针指向文件开头。

    fopen(char *filename,char *type);

    其中*filename是要打开文件的文件名指针,一般用双引号括起来的文件名表示,也可使用双反斜杠隔开的路径名。而*type参数表示了对打开文件的操作方式。其可采用的操作方式如下: 方式 含义 "r" 打开,只读; "w" 打开,文件指针指到头,只写; "a" 打开,指向文件尾,在已存在文件中追加; "rb" 打开一个二进制文件,只读; "wb" 打开一个二进制文件,只写; "ab" 打开一个二进制文件,进行追加 ;"r+" 以读/写方式打开一个已存在的文件; "w+" 以读/写方式建立一个新的文本文件 ;"a+" 以读/写方式打开一个文件文件进行追加 ;"rb+" 以读/写方式打开一个二进制文件; "wb+" 以读/写方式建立一个新的二进制文件 ;"ab+" 以读/写方式打开一个二进制文件进行追加 ;当用fopen()成功的打开一个文件时,该函数将返回一个FILE指针,如果文件打开失败,将返回一个NULL指针。如想打开test文件,进行写:

    DOS操作系统对同时打开的文件数目是有限制的,缺省值为5,可以通过修改CONFIG.SYS文件改变这个设置。

    2.关闭文件函数fclose()

    文件操作完成后,必须要用fclose()函数进行关闭,这是因为对打开的文件进行写入时,若文件缓冲区的空间未被写入的内容填满,这些内容不会写到打开的文件中去而丢失。只有对打开的文件进行关闭操作时,停留在文件缓冲区的内容才能写到该文件中去,从而使文件完整。再者一旦关闭了文件,该文件对应的FILE结构将被释放,从而使关闭的文件得到保护,因为这时对该文件的存取操作将不会进行。文件的关闭也意味着释放了该文件的缓冲区。

    int fclose(FILE *stream); 

    它表示该函数将关闭FILE指针对应的文件,并返回一个整数值。若成功地关闭了文件,则返回一个0值,否则返回一个非0值。常用以下方法进行测试:


    当打开多个文件进行操作,而又要同时关闭时,可采用fcloseall()函数,它将关闭所有在程序中打开的文件。 int fcloseall(); 该函数将关闭所有已打开的文件,将各文件缓冲区未装满的内容写到相应的文件中去,接着释放这些缓冲区,并返回关闭文件的数目。如关闭了4个文件,则当执行: n=fcloseall(); 时,n应为4。

    3.文件的读写

    (1).读写文件中字符的函数(一次只读写文件中的一个字符):

    int fgetc(FILE *stream);

    int getchar(void);

    int fputc(int ch,FILE *stream);

    int putchar(int ch);

    int getc(FILE *stream);

    int putc(int ch,FILE *stream);

    其中fgetc()函数将把由流指针指向的文件中的一个字符读出,例如: ch=fgetc(fp); 将把流指针fp指向的文件中的一个字符读出,并赋给ch,当执行fgetc()函数时,若当时文件指针指到文件尾,即遇到文件结束标志EOF(其对应值为-1),该函数返回一个-1给ch,在程序中常用检查该函数返回值是否为-1来判断是否已读到文件尾,从而决定是否继续。

    该程序以只读方式打开myfile.txt文件,在执行while循环时,文件指针每循环一次后移一个字符位置。用fgetc()函数将文件指针指定的字符读到ch变量中,然后用fputc()函数在屏幕上显示,当读到文件结束标志EOF时,关闭该文件。 上面的程序用到了fputc()函数,该函数将字符变量ch的值写到流指针指定的文件中去,由于流指针用的是标准输出(显示器)的FILE指针stdout,故读出的字符将在显示器上显示。又比如: fputc(ch,fp); 该函数执行结构,将把ch表示的字符送到流指针fp指向的文件中去。 在TC中,putc()等价于fputc(),getc()等价于fgetc()。 putchar(c)相当于fputc(c,stdout);getchar()相当于fgetc(stdin)。 注意,这里使用char ch,其实是不科学的,因为最后判断结束标志时,是看ch!=EOF,而EOF的值为-1,这显然和char是不能比较的。所以,某些使用,我们都定义成int ch。

    (2).读写文件中字符串的函数

    char *fgets(char *string,int n,FILE *stream);

    char *gets(char *s);

    int fprintf(FILE *stream,char *format,variable-list);

    int fputs(char *string,FILE *stream);

    int fscanf(FILE *stream,char *format,variable-list);

    其中fgets()函数将把由流指针指定的文件中n-1个字符,读到由指针string指向的字符数组中去,例如: fgets(buffer,9,fp); 将把fp指向的文件中的8个字符读到buffer内存区,buffer可以是定义的字符数组,也可以是动态分配的内存区。 注意,fgets()函数读到'/n'就停止,而不管是否达到数目要求。同时在读取字符串的最后加上'/0'。 fgets()函数执行完以后,返回一个指向该串的指针。如果读到文件尾或出错,则均返回一个空指针NULL,所以长用feof()函数来测定是否到了文件尾或者是ferror()函数来测试是否出错,例如下面的程序用fgets()函数读test.txt文件中的第一行并显示出来:

    gets()函数执行时,只要未遇到换行符或文件结束标志,将一直读下去。因此读到什么时候为止,需要用户进行控制,否则可能造成存储区的溢出。 fputs()函数想指定文件写入一个由string指向的字符串,'/0'不写入文件。 fprintf()和fscanf()同printf()和scanf()函数类似,不同之处就是printf()函数是想显示器输出,fprintf()则是向流指针指向的文件输出;fscanf()是从文件输入。 下面程序是向文件test.dat里输入一些字符:

    用DOS的TYPE命令显示TEST.DAT的内容如下所示: 屏幕显示 Your score of TOEFL is: 617 That's good news 下面的程序是把上面的文件test.dat里的内容在屏幕上显示出来:

    运行后屏幕显示: Your score of TOEFL is: 617 That's good news

    4.清除和设置文件缓冲区

    (1).清除文件缓冲区函数:

     int fflush(FILE *stream); 

    int flushall();

     fflush()函数将清除由stream指向的文件缓冲区里的内容,常用于写完一些数据后,立即用该函数清除缓冲区,以免误操作时,破坏原来的数据。 flushall()将清除所有打开文件所对应的文件缓冲区。

    (2).设置文件缓冲区函数

     void setbuf(FILE *stream,char *buf); 

    void setvbuf(FILE *stream,char *buf,int type,unsigned size); 

    这两个函数将使得打开文件后,用户可建立自己的文件缓冲区,而不使用fopen()函数打开文件设定的默认缓冲区。 对于setbuf()函数,buf指出的缓冲区长度由头文件stdio.h中定义的宏BUFSIZE的值决定,缺省值为512字节。当选定buf为空时,setbuf函数将使的文件I/O不带缓冲。而对setvbuf函数,则由malloc函数来分配缓冲区。参数size指明了缓冲区的长度(必须大于0),而参数type则表示了缓冲的类型,其值可以取如下值: type 值 含义 _IOFBF 文件全部缓冲,即缓冲区装满后,才能对文件读写 _IOLBF 文件行缓冲,即缓冲区接收到一个换行符时,才能对文件读写 _IONBF 文件不缓冲,此时忽略buf,size的值,直接读写文件,不再经过文件缓冲区缓冲。

    5.文件的随机读写函数

     前面介绍的文件的字符/字符串读写,均是进行文件的顺序读写,即总是从文件的开头开始进行读写。这显然不能满足我们的要求,C语言提供了移动文件指针和随机读写的函数,它们是:

    (1).移动文件指针函数:

     long ftell(FILE *stream);

     int rewind(FILE *stream);

     fseek(FILE *stream,long offset,int origin);

     函数ftell()用来得到文件指针离文件开头的偏移量。当返回值是-1时表示出错。 rewind()函数用于文件指针移到文件的开头,当移动成功时,返回0,否则返回一个非0值。 fseek()函数用于把文件指针以origin为起点移动offset个字节,其中origin指出的位置可有以下几种:

     origin 数值 代表的具体位置 

    SEEK_SET 0 文件开头

     SEEK_CUR 1 文件指针当前位置

     SEEK_END 2 文件尾 

    例如: fseek(fp,10L,0); 把文件指针从文件开头移到第10字节处,由于offset参数要求是长整型数,故其数后带L。

     fseek(fp,-15L,2); 把文件指针从文件尾向前移动15字节。

    (2).文件随机读写函数

     int fread(void *ptr,int size,int nitems,FILE *stream);

     int fwrite(void *ptr,int size,int nitems,FILE *stream);

     fread()函数从流指针指定的文件中读取nitems个数据项,每个数据项的长度为size个字节,读取的nitems数据项存入由ptr指针指向的内存缓冲区中,在执行fread()函数时,文件指针随着读取的字节数而向后移动,最后移动结束的位置等于实际读出的字节数。该函数执行结束后,将返回实际读出的数据项数,这个数据项数不一定等于设置的nitems,因为若文件中没有足够的数据项,或读中间出错,都会导致返回的数据项数少于设置的nitems。当返回数不等于nitems时,可以用feof()或ferror()函数进行检查。 fwrite()函数从ptr指向的缓冲区中取出长度为size字节的nitems个数据项,写入到流指针stream指向的文件中,执行该操作后,文件指针将向后移动,移动的字节数等于写入文件的字节数目。该函数操作完成后,也将返回写入的数据项数。

    二、非标准文件的读写

     这类函数最早用于UNIX操作系统,ANSI标准未定义,但有时也经常用到,DOS 3.0以上版本支持这些函数。它们的头文件为io.h。 由于我们不常用这些函数,所以在这里就简单说一下。

    1.文件的打开和关闭

     open()函数的作用是打开文件,其调用格式为: int open(char *filename, int access); 该函数表示按access的要求打开名为filename的文件,返回值为文件描述字,其中access有两部分内容: 基本模式和修饰符, 两者用" "("或")方式连接。修饰符可以有多个, 但基本模式只能有一个。 access的规定 -------------------------------------------------------- 基本模式 含义 修饰符 含 义 -------------------------------------------------------- O_RDONLY 只读 O_APPEND 文件指针指向末尾 O_WRONLY 只写 O_CREAT 文件不存在时创建文件, 属性按基本模式属性 O_RDWR 读写 O_TRUNC 若文件存在, 将其长度缩为0, 属性不变 O_BINARY 打开一个二进制文件 O_TEXT 打开一个文字文件 --------------------------------------------------------- open()函数打开成功, 返回值就是文件描述字的值(非负值), 否则返回-1。 close()函数的作用是关闭由open()函数打开的文件, 其调用格式为: int close(int handle); 该函数关闭文件描述字handle相连的文件。

    2.读写函数

     int read(int handle, void *buf, int count);

     read()函数从handle(文件描述字)相连的文件中, 读取count个字节放到buf所指的缓冲区中, 返回值为实际所读字节数, 返回-1表示出错。返回0 表示文件结束。 write()函数的调用格式为: int write(int handle, void *buf, int count); write()函数把count个字节从buf指向的缓冲区写入与handle相连的文件中, 返回值为实际写入的字节数。

    3.随机定位函数

     lseek()函数的调用格式为: int lseek(int handle, long offset, int fromwhere); 

    该函数对与handle相连的文件位置指针进行定位,功能和用法与fseek()函数相同。 tell()函数的调用格式为: long tell(int handle); 该函数返回与handle相连的文件现生位置指针, 功能和用法与ftell()相同

    5. read 函数和 write 函数

    来源:蚂蚁的 C/C++ 标准编程 作者:antigloss

    1. read 

    #include ssize_t read(int filedes, void *buf, size_t nbytes); 返回值:读取到的字节数;0(读到 EOF);-1(出错) read 函数从 filedes 指定的已打开文件中读取 nbytes 字节到 buf 中。以下几种情况会导致读取到的字节数小于 nbytes :

    A. 读取普通文件时,读到文件末尾还不够 nbytes 字节。例如:如果文件只有 30 字节,而我们想读取 100 字节,那么实际读到的只有 30 字节,read 函数返回 30 。此时再使用 read 函数作用于这个文件会导致 read 返回 0 。

    B. 从终端设备(terminal device)读取时,一般情况下每次只能读取一行。

    C. 从网络读取时,网络缓存可能导致读取的字节数小于 nbytes 字节。

    D. 读取 pipe 或者 FIFO 时,pipe 或 FIFO 里的字节数可能小于 nbytes 。

    E. 从面向记录(record-oriented)的设备读取时,某些面向记录的设备(如磁带)每次最多只能返回一个记录。 F. 在读取了部分数据时被信号中断。读操作始于 cfo 。在成功返回之前,cfo 增加,增量为实际读取到的字节数。

    2. write

     #include ssize_t write(int filedes, const void *buf, size_t nbytes); 返回值:写入文件的字节数(成功);-1(出错)write 函数向 filedes 中写入 nbytes 字节数据,数据来源为 buf 。返回值一般总是等于 nbytes,否则就是出错了。常见的出错原因是磁盘空间满了或者超过了文件大小限制。 对于普通文件,写操作始于 cfo 。如果打开文件时使用了 O_APPEND,则每次写操作都将数据写入文件末尾。成功写入后,cfo 增加,增量为实际写入的字节数。

    展开全文
  • 【Matlab学习手记】文件读写完整版

    万次阅读 多人点赞 2020-04-13 20:03:06
    介绍Matlab读写文本文件的方法,包括load、dlmread、csvread、importdata、textscan、dlmwrite、csvwrite、save等函数的用法。 读文件 1. 纯数字 load test.txt % 导入文本数据,并保存在 test 变量; x= ...
  • C语言读写文件操作

    千次阅读 多人点赞 2018-12-28 20:05:11
    二、读写文件 1、字符的读写 2.字符串的读写 3.数据块的读写 4.格式化读写 三、关闭文件 C语言中对于文件的操作是通过指针来完成的,要注意,文件指针不是指向一段内存空间的,它实际上指向的是描述这个文件...
  • Java文件读写

    万次阅读 2019-06-11 15:17:20
    1.%g用于输出科学计数法 2.用printf输出换行除了’\n’,还可以用’%n’ 3.File类的几个构造方法: 1)File(String directoryPath) 2)File(String directoryPath,String filename) 3)File(File dirObj,String ...
  • 文件读写操作的几种模式

    千次阅读 2018-08-02 10:07:09
    r代表read的简写,+代表可读可写,w代表write,b代表bit二进制位,t代表text。...rt+ 读写打开一个文本文件,允许读和写,该文件必须存在(这里的写文件是指将之前的文件覆盖。 rb 只读打开一个二进制文件,,该文本...
  • c++文件读写操作

    万次阅读 多人点赞 2018-04-17 11:20:03
    近期适配几款游戏的数据,因为重复量太大,因此写一个对数据进行处理的程序,下面是整个...fstream提供了三个类,用来实现c++对文件的操作(文件的创建、读、写) ifstream -- 从已有的文件读入 ofstream -- 向...
  • 文件读写基本流程

    千次阅读 2018-09-06 11:26:53
    文件 1、进程调用库函数向内核发起读文件请求; 2、内核通过检查进程的文件描述符定位到虚拟文件系统的已打开文件列表表项; 3、调用该文件可用的系统调用函数read() 3、read()函数通过文件表项链接到目录项...
  • Android6.0以上文件读写权限

    万次阅读 2017-08-14 16:55:30
    1、AndroidManifest.xml 文件添加: 2、onCreate()或其他访问文件位置添加授权 private void checkPermission() { //检查权限(NEED_PERMISSION)是否被授权 PackageManager.PERMISSION...
  • centos7.2开放文件给所有 用户读写和执行的权限 最好在root用户下执行如下命令: chmod 777 + 文件名
  • 执行chmod -R 777 文件夹名称 该命令会将文件夹下的所有文件的权限都设为777
  • Qt文本文件读写操作

    万次阅读 2017-12-28 17:02:57
    Qt文本的读写
  • Linux查看、修改文件读写权限

    万次阅读 2019-10-12 15:48:12
    整理下Linux文件权限相关知识 一、查看文件夹或文件的可读可写权限: ls -l 文件夹 解析“drwxrwxrwx”,这个权限说明一共10位。 第一位代表文件类型,有两个数值:“d”和“-”,“d”代表目录,“-”...
  • mount 挂载文件系统为读写模式

    万次阅读 2012-01-22 10:41:15
    mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system mount -o remount,rw -t rootfs rootfs /
  • 问题:最近在win10下修改Git Bash的配置文件,但文件需要管理员权限才能修改,但一直找不到使用管理员身份打开文件的方法… 解决方案:修改文件读写权限 右键 -> 属性 -> 安全 -> 编辑 找到你的用户 在...
  • C语言读写文件的操作

    万次阅读 2018-05-07 21:41:07
    文件读写是有两个文件来实现的,一个是写入数据,一个读出数据,根据代码进行解析吧。举一个最简单的例子:# include &lt;stdio.h&gt; # include &lt;stdlib.h&gt; int main(void) { int k, n, ...
  • chown -R name:pwd /usr/local name是用户名,pwd是密码 记得切换到超级管理员下再执行此命令
  • android Q(10) 在读写文件时引入的权限问题

    千次阅读 热门讨论 2019-11-11 21:45:47
    在安卓Q上操作文件读写时遇到的问题,进行记录。 获取到文件夹的对象之后,调用listFiles()方法尝试获取该目录下面的文件时出现了问题,返回值永远是null,在网上查找了一番之后基本都指向了权限问题,但是通过调试...
1 2 3 4 5 ... 20
收藏数 797,589
精华内容 319,035
关键字:

文件读写