在编程时一般默认从键盘直接读入数据,但有时候为了避免多次输入测试用例,可以直接使用从文件读取测试用例的方法,下面简述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。
本文结束。