文件读写是经常用到的,在C/C++中关于文件读写的函数也很毒,最近在使用文件读写的时候就发现一些问题,总结一下:
1. fgetc(); 函数原型是:int fgetc( FILE *stream );
该函数每一次从文件中读取一个字符,对于空格和回车都可以读取!
Source.txt 文件内容为“thank you very much”
验证程序如下:
#include
#include
#include
using namespace std;
int main()
{
FILE *infile; //连接source.txt的文件指针
FILE *outfile; //连接result.txt的文件指针
if((infile=fopen("source.txt","r"))==NULL)
{
cout<<"Failed to open file source.txt! Press any key to continue!"<
getchar();
exit(1);
}
if((outfile=fopen("result.txt","w"))==NULL)
{
cout<<"Failed to open file result.txt! Press any key to continue!"<
getchar();
exit(1);
}
char str[1024];
int i=0;
int M=0;
while(!feof(infile))
{
str[i++]= fgetc(infile);
}
cout<<"I:="<
return 0;
}
程序执行以后输出:I= 20;
本来是19个字符,输出是20,原因是在读文件的时候,整个文件作为string调进内存中,最后一个“/0”标示string的结尾,所以fgetc()把“/0”也读了进来!
如果在上述source.txt文件的末尾敲一下回车键,再运行程序输出I=21;其中包括回车键。所以21;
2. fputc();该函数的原型是int fputs( const char *string, FILE *stream );
其功能是把指定字符写入到文件中;
和函数fgetc()相对应的使用!
3. fscanf();该函数原型为:int fscanf( FILE *stream, const char *format [, argument ]... );
是格式化的读文件函数,
fprintf();该函数的原型为:int fprintf( FILE *stream, const char *format [, argument ]... );
是格式化的写文件函数;
测试程序代码为:
while(!feof(infile))
{
fscanf(infile,"%c",str);
fprintf(outfile,"%c",str);
}
4. fgets();该函数原型为:char *fgets( char *string, int n, FILE *stream );
可以理解为逐行读文件的函数,遇到回车键则返回,并丢弃回车键符号;将读取的整行内容作为一个string存储到char*string的内存中。
fputs();该函数原型为: int fputs( const char *string, FILE *stream );
将string指向的内容以字符串的形式一下写进文件中;
5. getline()函数;有关该函数详细说明如下:
#include
#include
#include <string>
using namespace std; //输出空行
void OutPutAnEmptyLine()
{
cout<<"/n";
}
//读取方式: 逐词读取, 词之间用空格区分
void ReadDataFromFileWBW()
{
ifstream fin("data.txt");
string s;
while( fin >> s )
{
cout << "Read from file: " << s << endl;
}
}
//读取方式: 逐行读取, 将行读入字符数组, 行之间用回车换行区分
{
ifstream fin("data.txt");
const int LINE_LENGTH = 100;
char str[LINE_LENGTH];
while( fin.getline(str,LINE_LENGTH) )
{
cout << "Read from file: " << str << endl;
}
}
//读取方式: 逐行读取, 将行读入字符串, 行之间用回车换行区分
void ReadDataFromFileLBLIntoString()
{ ifstream fin("data.txt");
string s;
while( getline(fin,s) )
{
cout << "Read from file: " << s << endl;
}
}
int main()
{
// 此处省略验证代码!
Return 0;
}