您的位置:首页 > 编程语言 > C语言/C++

C/C++对文件的读写

2016-05-15 17:44 711 查看

C/C++对文件的读写

学习在于总结

c/c++语言的相似度非常大。不管从事哪一个方向的开发,对c/c++都应该有了解,因为它们是操作系统的开发语言。了解它们对任何开发都是有好处的。

因为c++兼容c语言,所以c语言对文件的读取,c++都是可以运用的。当然c++也有专用于它的文件读写,更加的方便 和简单。

c语言对文件的读写

#include <iostream>
#include <stdio.h>

using namespace std;

void readFile();
void writeFile();

int main()
{
//读取文件内容
readFile();

//向文件写入内容
writeFile();

return 0;
}

void readFile()
{
char fileName[256] = { 0 };
FILE* file;

while(true)
{
cout << "please input fileName:";
cin >> fileName;
cout <<fileName<<endl;
if((file = fopen(fileName,"r")) == NULL)//“r”为读取文件内容,如果不存在文件则返回null,详细见下面的writeFile()方法
{
cout <<"Error!!"<<endl;
continue;
}
//导航到文件末尾
fseek(file,0,SEEK_END);
//得到文件的字节数
int l = ftell(file);
//回到文件开头
//fseek(file,0,SEEK_SET);//用fseek定位到文件开头
rewind(file);//回到文件起始位置

//输出文件的长度
cout<<l<<endl;

//用fscanf循环输出文件中的内容
/*for(int i = 0; i < l; i++)
{
char ch;
fscanf(file,"%c",&ch);
cout << ch;
}
*/

//用feof函数来判断文件是否指向末尾
//因为用feof进行判断文件是不是结束的时候,当指针指向最后一个字符的时候,依然存在字符,所以不会认为是文件最后,会继续向后面多读取一个字符。
//只有当指针指向的地方没有东西或者乱码时,才会认为是指向了最后。所以往往会多读取一个字符,最后多读取的字符往往为乱码,读取之后,才能知道是文件最后了,但是也要读,所以是乱码。这个乱码字符已经读取了。
//因为无法阻止它多读,所以只能不让最后一个乱码输出,来解决多输出一个字符的问题。所以用下面代码来表示:
cout << "feof" <<endl;
char ch;
fscanf(file,"%c",&ch);//先读取一个字符,让文件指针指向第一个字符,即指针向后移动一位。因为刚开始指针不指向第一个字符,而是指向第一个字符前面,文件头
while(!feof(file))//首先判断读取的第一个字符的位置是不是文件结束,不是的话则进入循环,输出第一个字符(然后在向后读取一位,让指针向后移动,指向读取的这一位,然后判断这一位是不是空,是的话则结束,说明这一位读出来的内容是乱码)。
//是的话则结束,则说明读取的内容是乱码,文件是空文件,也不用输出了,因为会是乱码。
{
cout <<ch;
fscanf(file,"%c",&ch);
}

/*
//用fread读取文件中的内容,块读取
//fileContent储存读出来的内容
char* fileContent = new char[l];
fread(fileContent,l,1,file);//fileContent为储存内容的数组;l为读取字节的长度;1表示只读取一边;file为文件的指针
//输出内容
cout << fileContent <<endl;
*/

/*
//得到一个字节
//因为用feof进行判断文件是不是结束的时候,当指针指向最后一个字符的时候,依然存在字符,所以不会认为是文件最后,会继续向后面多读取一个字符。
//只有当指针指向的地方没有东西时,才会认为是指向了最后。所以往往会多读取一个字符,最后多读取的字符往往为乱码,读取之后,才判断出来是文件最后了,但是这个乱码字符已经读取了。
//因为无法阻止它多读,所以只能不让最后一个乱码输出,来解决多输出一个字符的问题。所以用下面代码来表示:
char ch  = fgetc(file);
while(!feof(file));
{
cout << ch;
ch = fgetc(file);
}
*/

/*
//读取一个字符串
char* fileContent = new char[l];
fgets(fileContent,l,file);//fileContent为储存读取内容的数组,l为读取的最大长度,file为读取的文件的指针
cout << fileContent;
*/
cout <<endl;
fclose(file);
break;
}

}

void writeFile()
{
char fileName[256] = { 0 };
FILE* file;
while(true)
{
cout << "please input fileName:";
cin >> fileName;

file = fopen(fileName,"a");//"r"打开文本文件进行读写,不存在,则返回NULL
//"a"如果存在文件,则在文件末尾加入内容,如果不存在则新建文件。
//“w”如果存在文件,则将文件删除,从新创建。如果不存在则新建文件。
//“r+”打开文本文件进行读/写,如果不存在则返回NULL
//“w+”建立新文本文件进行读/写,如果存在文件,则将文件删除,从新创建。如果不存在则新建文件
//“a+”如果存在文件,则向文件末尾追加读/写,如果不存在则新建文件进行读/写(用a+最后可能多输入几个乱码字符,原因未知)
//读取文件目前具有的字符个数
fseek(file,0,SEEK_END);
int l = ftell(file);
cout << "begin:" << l << endl;
fseek(file,0,SEEK_SET);//还可以用rewind(file);

/*
//以fprintf的方式向文件写内容
char ch[10]={'b','b','b','b','b','b','b','b','b','b'};
fprintf(file,"%s",ch);
printf("%s",ch);
*/

/*
//以fputc的方式向文件写入一个字符
char ch = 'a';
fputc(ch,file);//ch为要写入的字符,file为文件指针
*/

/*
//以fputs的方式向文件写入一个字符串
char ch[10]={'b','b','b','b','b','b','b','b','b','b'};
fputs(ch,file);//ch为要写入的字符串,file为文件指针
*/

//以fwrite的方式向文件写入内容块
char ch[10]={'b','b','b','b','b','b','b','b','b','b'};
long lenth = 10l;
int  count = 2;
fwrite(ch,lenth,count,file);//ch为要写入的内容,lenth为写入内容的大小,count为写入次数,可以写入多次,file为写内容的文件指针

//读取文件最后的字符个数
fseek(file,0,SEEK_END);
int l1 = ftell(file);
cout << "end:" << l1 << endl;
fseek(file,0,SEEK_SET);

fclose(file);//关闭文件
}
}


c++对文件的读写

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void readFile();
void writeFile();

int main()
{
// readFile();
writeFile();
}

void readFile()
{
char fileName[255] = {0};

while(true)
{
cout << "please input fileName:";
cin >> fileName;

ifstream in; //输入流
in.open(fileName);//打开文件
if(in == NULL)
{
cout << "Error!!"<< endl;
continue;
}

in.seekg(0,ios::end);//从结束位置开始计算偏移量,“ios::cur”从当前位置开始计算偏移量
int len = in.tellg ();
cout << len << endl;
in.seekg(0,ios::beg);//从文件开始位置开始计算偏移量

//read方式读取文件内容
/*
//读取全部内容
char* fileContent = new char[len];
in.read (fileContent,len);//fileContent存储读取的内容,len为读取的长度
cout << fileContent << endl;
*/
/*
//读取一个字符
char* ch = new char[1];
in.read(ch,1);
cout <<ch <<endl;
*/

//getLine方式读取一行
/*
//方法1:
string str;
getline(in,str);
cout <<str<<endl;
*/

/*
//方法2:
char* fileContent = new char[len-5];
in.getline (fileContent,len-5);
cout <<fileContent<<endl;
*/

/*
//读取单个字符
char ch;
for(int i = 0; i < len; i++)
{
in >> ch;
cout << ch;
}
*/

/*
//读取字符串
string st ;
in >> st;
cout<<st;
*/

//读取一个字符数组
char ch[len] = {0};
for(int i = 0; i <len ;i++)
{
in >> ch[i];
cout << ch[i];
}

cout << endl;

in.close();

}
}

void writeFile()
{
char fileName[255] = {0};
cout << "please input fileName:";
cin >> fileName;

ofstream out;
out.open(fileName);
if(out == NULL)
{
cout << "Error!!"<<endl;
return ;
}

while(true)
{
/*
//向文件写入单个字符
char ch = 'c';
out << ch;
*/

/*
//向文件写入数组
char ch[10] = {'a','b','c','d','e','f','j','f','g','h'};
out << ch;
*/

/*
//向文输出字符串
string str = "123456";
out <<str;
*/

/*
//以write方式向文件写内容
char ch[10] = {'1','2','3','4','5','6','7','8','9','0'};
out.seekp (0,ios::end);//定位到文件末尾写入
out.write (ch,10);//ch为要写入的内容,10为写入的长度
*/

//向文件写入一个字符
char ch = 'b';
out.put(ch);//输入一个字符
break;

}
out.close();

}


总结

以上内容就是我总结的 文件读取。如果不全,以后会补充完整。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: