C语言和C++读写文件操作汇总

C语言读文件常用操作

方式一:用 feof()判断结束条件

(首种方式列出完整代码。后面几种方式只写文件操作的核心代码)
案例:读取test1.txt文件内容并在控制台输出

#include<stdio.h>

int main(int argc, char* argv[] ){
	
	FILE *f;
    f = fopen("test1.txt", "r");  //以只读的方式打开filename.txt 
    char c;

    //方式一:用 feof()判断结束条件 
    if(f != NULL)
    {
        while(!feof(f))
            printf("%c", fgetc(f));
    }
    else
        printf("Fail to open! \n");
    fclose(f); //关闭文件流
    
	return 0;
} 

这里有三个函数需要注意一下:
fopen():读取文件

C 库函数 FILE *fopen(const char *filename, const char *mode) 使用给定的模式 mode 打开 filename 所指向的文件。filename – 这是 C 字符串,包含了要打开的文件名称。
mode – 这是 C 字符串,包含了文件访问模式,模式如下:

模式标志描述
“r”打开一个用于读取的文件。该文件必须存在。
“w”创建一个用于写入的空文件。如果文件名称与已存在的文件相同,则会删除已有文件的内容,文件被视为一个新的空文件。
“a”追加到一个文件。写操作向文件末尾追加数据。如果文件不存在,则创建文件。
“r+”打开一个用于更新的文件,可读取也可写入。该文件必须存在。
“w+”创建一个用于读写的空文件。
“a+”打开一个用于读取和追加的文件。

该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。

feof():功能是检测流上的文件结束符,如果文件结束:返回非0值;如果文件未结束:返回0值。

C 库函数 int feof(FILE *stream) 测试给定流 stream 的文件结束标识符。stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
当设置了与流关联的文件结束标识符时,该函数返回一个非零值,否则返回零。

fgetc()::从文件指针指定的文件中读入一个字符.

int fgetc(FILE *stream) 从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流。该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。

方式二:用 EOF判断结束条件

if(f != NULL)
    {
		c = fgetc(f); 
        while(c != EOF)
        {
            putchar(c);
            c = fgetc(f);
        }
    }
        else
        printf("Fail to open! \n");
    fclose(f);

注意putchar()函数:

C 库函数 int putchar(int char) 把参数 char 指定的字符(一个无符号字符)写入到标准输出 stdout 中。char – 这是要被写入的字符。该字符以其对应的 int 值进行传递。该函数以无符号 char 强制转换为 int 的形式返回写入的字符,如果发生错误则返回 EOF。

方式三:另一种用 EOF判断结束条件

 if((f = fopen("test1.txt", "r")) != NULL)
 	 while((c = fgetc(f)) != EOF)
            putchar(c);  
else
    printf("Fail to open! \n");
fclose(f);

方式四:用fscanf()按格式读入

(见写入文件方法二)

C语言写文件常用操作

案例:将“Hello, world!”写入到test2.txt文件中。

方式一:用fputc()方法

C 库函数 int fputc(int char, FILE *stream) 把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并char – 这是要被写入的字符。该字符以其对应的 int 值进行传递。
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。把位置标识符往前移动。
如果没有发生错误,则返回被写入的字符。如果发生错误,则返回 EOF,并设置错误标识符。

#include<stdio.h>
#include<string.h>

int main(int argc, char* argv[] ){
    FILE *fp;
    char s[30] = "Hello, world!";
	if((fp = fopen("test2.txt", "w")) == NULL)
        printf("Fail to open! \n");	  
    else{
    	int i;
    	for(i = 0; i < strlen(s); i++)
    	{
        fputc(s[i], fp);
   		}
    	fputc('\n', fp);
	}
    
    fclose(fp);	
	return 0;
} 

方式二:用 fprintf()格式化输出

C 库函数 int fprintf(FILE *stream, const char *format, …) 发送格式化输出到流 stream 中。参数
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
format – 这是 C 字符串,包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。format 标签属性是 %[flags][width][.precision][length]specifier,具体讲解如下:
specifier(说明符) 输出
c 字符
d 或 i 有符号十进制整数
e 使用 e 字符的科学科学记数法(尾数和指数)
E 使用 E 字符的科学科学记数法(尾数和指数)
f 十进制浮点数
g 自动选择 %e 或 %f 中合适的表示法
G 自动选择 %E 或 %f 中合适的表示法
o 有符号八进制
s 字符的字符串
u 无符号十进制整数
x 无符号十六进制整数
X 无符号十六进制整数(大写字母)
p 指针地址
n 无输出
% 字符
如果成功,则返回写入的字符总数,否则返回一个负数。

	int a = 100;
    char s[30] = "Hello, world!";
    char c = 'T';
    FILE *fp;
    if((fp = fopen("test2.txt", "w+")) == NULL)
        printf("Fail to open! \n");
    else
        fprintf(fp, "%d, %s, %c", a, s, c); //将数据格式化输出到文件test2.txt中    
    fscanf(fp,  "%d, %s, %c", &a, &s, &c); //从文件中格式化读取数据
    printf("%d, %s, %c \n", a, s, c); //格式化输出到屏幕

    fclose(fp);
	
	return 0;

C++读写文件常用操作

C++ 中标准库 fstream,它定义了三个新的数据类型:

ofstream 该数据类型表示输出文件流,用于创建文件并向文件写入信息。
ifstream 该数据类型表示输入文件流,用于从文件读取信息。
fstream 该数据类型通常表示文件流,且同时具有 ofstream 和 ifstream 两种功能,这意味着它可以创建文件,向文件写入信息,从文件读取信息。

在从文件读取信息或者向文件写入信息之前,必须先打开文件。ofstream 和 fstream 对象都可以用来打开文件进行写操作,如果只需要打开文件进行读操作,则使用 ifstream 对象。

下面是 open() 函数的标准语法,open() 函数是 fstream、ifstream 和 ofstream 对象的一个成员。

void open(const char *filename, ios::openmode mode);
在这里,open() 成员函数的第一参数指定要打开的文件的名称和位置,第二个参数定义文件被打开的模式。

模式标志描述
ios::ate文件打开后定位到文件末尾。
ios::in打开文件用于读取。
ios::out打开文件用于写入。
ios::trunc如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0。
#include <iostream>
#include<cstring>
#include<fstream>
using namespace std;

int main(void){
	ifstream input;
	input.open("test1.txt", ios::in);
		if(!input){
		cout<<"文件不存在"<<endl;
		exit(1);
	}
	if(input.peek()==EOF){
		cout<<"文件为空"<<endl;
	}
	while(!input.eof()){//防止多读一行,可以用.peek()!=EOF;//作为循环条件,重新打开后,从头读取
		string str;
		getline(input,str);
		cout<<str<<endl;
	}
	input.close();
	
	ofstream myfile;
    myfile.open("test2.txt", ios::out | ios::trunc );//以写入模式打开文件,并希望截断文件,以防文件已存在
	myfile<<"Hello, world!"<<endl;//使用时完全同cout可以用setw控制
	myfile.close();
	myfile.open("test2.txt",ios_base::app);   //追加模式。所有写入都追加到文件末尾。
	myfile<<"Hi!"<<endl;
	myfile.close();
	return 0;
}

打开test2.txt文件可以看到如下内容:
在这里插入图片描述

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dijkstra's Monk-ey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值