C/C++实现读取文件语句

在编程时一般默认从键盘直接读入数据,但有时候为了避免多次输入测试用例,可以直接使用从文件读取测试用例的方法,下面简述C和C++怎样读取一个文件内容。
其实C和C++差别不大,很多东西C可以使用的C++也都可以使用,但C++能使用的C不一定能使用。
C和C++都可以使用的方法:
1.使用freopen,这个是一个重定向的函数,也就是将默认的从键盘读入改为从文件中读入内容。使用方法如下:

#include <cstdio> //使用freopen前要先引入cstdio头文件
//如果是C语言也可以使用#include<stdio.h>库
FILE* freopen(const char* filename,const char * mode,FILE* stream)

filename:要打开的文件名
mode:打开的模式(r/w)(和fopen一样)
stream:通常使用标准流文件(stdout/stdin/stderr)
stdout是标准输出流,默认为屏幕;
stdin是标准输入流,默认从屏幕上读入;
stderr是标准错误流,一般把屏幕设为默认。
下面两个例子:

freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);//如果out.txt文件不存在系统会自动创建并把内容写入

上面的代码和说明引用自
原文链接:https://blog.csdn.net/weixin_46700012/article/details/107988146
当然,打开的模式不止r和w两种,还有以下几种方式

r+是读写方式,读写指针都在文件头。
w是只写方式
w+是读写方式建立新文件,读指针在文件头。
a是追加方式打开文件,指针指向文件尾;
a+是读写方式打开文件,读从文件开始,写从文件尾开始。
“r"或"rb” 以只读方式打开文件,该文件必须存在。
“w"或"wb” 以写方式打开文件,同时会覆盖文件以前的内容。
“a"或"ab” 以追加方式打开文件,指针指向文件尾。
"r+"或"rb+“或"r+b” r+是读写方式,读写指针都在文件头。
"w+"或"wb+“或"w+b” 以读写方式打开,并把文件长度截短为零。
"a+"或"ab+“或"a+b” 以读写方式打开,读从文件开始,写从文件尾开始。
字母b表示文件时一个二进制文件而不是文本文件。

由于freopen函数相当于是重定向,所以可以直接使用scanf和printf来读写文件。接下来是fopen

fp=fopen(const char* filename,const char * mode)

这里就只有两个参数一个是文件名,一个是指明读写方式,然后赋值给fp就可以通过fp来访问文件。

fp=fopen("hafumianbianma.txt","r")
while(!feof(fp))//如果文件没有结束
		fread(&file[i++],1,1,fp);
fclose(fp);

接下来比较freopen和fopen的区别
先使用freopen,代码如下,并将代码存在草稿.cpp中,而test1.cpp存放的是一个哈夫曼的没写完的代码

#include <iostream>
#include <cstdio> //使用freopen,需调用cstdio库
using namespace std;
int main() {
	FILE*fp1,*fp2;
	fp1=freopen("test1.cpp","r",stdin);
	fp2=freopen("草稿1.cpp","r",stdin);

	freopen("out.txt","a",stdout);
	char n;
	while(fscanf(fp1,"%c",&n) == 1) 
		cout << n ;
	
	fclose(fp2); fclose(stdout); //关闭文件
	fclose(fp1);
	return 0;
	
}

会发现它输出的是fp2也就是草稿.cpp中的内容,并且是输出在文件。
在这里插入图片描述接下来使用fopen
代码如下:

#include <iostream>
#include <cstdio> //使用freopen,需调用cstdio库
using namespace std;
int main() {
	FILE*fp1,*fp2,*fp3;
	fp1=fopen("test1.cpp","r");
	fp2=fopen("草稿1.cpp","r");

	fp3=fopen("out.txt","w");
	char n;
	while(fscanf(fp1,"%c",&n) == 1) 
		cout << n ;
	
	fclose(fp2); fclose(fp3); //关闭文件
	fclose(fp1);
	return 0;
	
}

输出结果如下
在这里插入图片描述

显而易见,它输出的才是正确的fp1的内容,且输出是在键盘,而out.txt文件中什么也没有。
在这里插入图片描述我还可以把两个文件同时读取输出
在这里插入图片描述
综上,我们会发现freopen就是直接改变了读入和写出文件的位置,因此可以直接用C的scanf和printf或者C++的cin或cout读写文件,但是他的读写比较僵硬,分别只能对一个文件有效。而要想灵活的切换文件,在不同的文件中读,就必须使用fopen,而且fopen不仅可以从文件读数据还同时可从键盘读取数据,但从文件读数据的时候要使用fscanf,fprintf等。
一下这段直接复制看见的一个贴(吐槽一句,我只是打算写哈夫曼树其中有一个文件打开,然后就去搜了打开文件的功能来看,结果花了挺长时间才把这篇博客写出来,接下来还得去弄哈夫曼文件加密解密)
还有一个是只有C++中才有的文件读取方式:文件输入输出流(fstream)

cout、cin就是输入输出流。所以文件输入输出流对cin、cout语句是适用的。
由于C++中没有现成的文件输入输出流,所以要包含进头文件fstream。
fstream中有两个类,一个文件输入流(ifstream),一个文件输出流(ofstream)。
————————————————
版权声明:本文为CSDN博主「weixin_46700012」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_46700012/article/details/107988146
接下来换我上场,改了一下他的程序运行了一下感觉效果不是特别好,代码和输出如下:

#include <fstream> //顺便说一句,iostream是包含在fstream里面的
using namespace std;
int main() {
	ifstream fin1("草稿1.cpp"); //赋值,方式为ifstream/ofstream 变量名("文件名.后缀名");
	ofstream fout1("out.txt");
	char n;
	while(fin1 >> n/*跟cin差不多*/) 
	fout1 << n ; //跟cout差不多,也能使用endl
	fin1.close(); fout1.close(); //关闭文件
	return 0;
}

在这里插入图片描述我所有的换行符都没了,全部直接粘在了一起,由于时间不够就不接着往下研究了,上面这个也就是直接定义一个ifstream(输出流)或者ofstream(输出流),然后给一个名字,使用该名字>>或者输出符号<<就可以直接读取或输出到文件,顺便测试了一下,如果读取多个文件的内容输出到一个文件,输出文件是直接在末尾加上内容,也就相当于上面的模式a。
本文结束。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值