C指针文件操作
文件操作的基本方式
(w+/a+/r+)
#include<iostream>
using namespace std;
file *fp=fopen("in.txt","a+")//以a+方式打开文件
file *fp1=fopen("out.txt","a+")//以a+方式打开文件
while(fscanf(fp,"%s",str) != EOF){
fprintf(fp1,"%s\n",str);
}
char str[][];
// 当一个字符都没有读到时,fgets()返回NULL
while(fgets(str,1024,fp)){
fputs(str,fp);
}
char ch = fgetc(fp); // fgetc(*fp)函数返回int值
// 如果从标准输入读取一个字符,可以用getchar();
fputc(ch,fp1);
fclose(fp);//在使用完文件指针后及时关闭文件防止内存泄漏
fclose(fp1);
补充说明:
gets(s)是从标准输入输出里读取数据(不关心s的大小)。容易导致内存泄漏。C11标准已经正式废除。
如果必须使用fgets的话,可以考虑尝试使用fgets(buf,maxn,stdin)
本人目前最常使用的文件读取方式:getline(cin,str) 从标准输入流读取一行字符
除上面的这种方式之外,还有输入输出重定向(将标准输入输出流重定向至文件流)
输入输出的重定向
freopen("in.txt","r",stdin);//输入输出的重定向
//更常见的用法是用于本地实现文件输入输出,提交到online_judge时采用标准输入输出,下面代码是该用法的示例
//如果LOCAL宏已被定义或者编译选项包含LOCAL(gcc 1.cpp -o test -DLOCAL),
//则执行输入输出重定向。否则为标准输入输出
#ifdef LOCAL
freopen("in.txt","r",stdin);//输入输出的重定向s
#endif
scanf("%s",buf);
代码示例
#define LOCAL
int main(){
#ifdef LOCAL
freopen("in.txt","r",stdin);//输入输出的重定向
#endif
int s;
while(scanf("%d",&s) != EOF){
cout<<s<<endl;
}
fclose(stdin);
return 0;
}
c++文件输入输出流操作
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
int a[10];
ifstream in("读入.txt");
for(int i=0;i<10;i++)
in>>a[i];
for(int i=0;i<10;i++)
cout<<a[i]<<endl;
ofstream out("输出.txt");
out<<"完全ojbk";
in.close();
out.close();
//程序使用cin.get()函数可以简单地暂停屏幕直到按回车键,并且不需要存储字符
cin.get();
}
将输入的一组数据作为int类型读取
示例程序作用说明:
从标准stdin中输入一列数字例如:12 22 33 43 11
示例程序会依次将12、22、33、43、11读入变量x;(x1 = 12,x2 = 22…)
然后依次计算sum = x1 + x2 + x3 + x4 + x5;
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main(){
string line
while(cin >> line){
int sum = 0,x;
stringstream ss(line);
while(ss >> x) sum += x;
cout << sum << "\n";
}
return 0;
}
cin,getline与换行符的关系
cin在读取输入的时候,会跳过换行符,也就是换行符还停留在缓冲区中,遇到空白字符就停止。
getline()读取输入的时候,遇到换行符就会停止,但是换行符不会停留在缓冲区中。因此getline()不是跳过换行符而是直接舍弃换行符
gets()也是遇到换行符就会停止,但是会跳过换行符。可搭配ch=getchar();
int main(){
string str;
cin>>str;
cout<<str<<endl;
char ch = getchar(); //吸收cin跳过的换行符
cout<<(int)ch<<endl;
while(getline(cin,str)){
cout<<str<<endl;
}
return 0;
}