ofstream,ifstream
ofstream tx;
tx.open("info.txt",ios:app);//追加方式
tx<<"hello word \r";
tx.close();
unsigned char str1[]="I Love You";
int n[5];
ifstream in("xxx.xxx");
ofstream out("yyy.yyy");
out.write(str1,strlen(str1));//把字符串str1全部写到yyy.yyy中
in.read((unsigned char*)n,sizeof(n));//从xxx.xxx中读取指定个整数,注意类型转换
in.close();out.close();
File (有问题,需修正)
//读文件1
FILE *pFile = fopen("file.txt", "rb");
if (pFile == NULL)
{
perror ("Error opening file");
return 0;
}
char buf[100] = { 0 };
while (!feof(pFile)) //没有到文件末尾
{
memset(buf, 0, sizeof(buf));
size_t len = fread(buf, sizeof(char), sizeof(buf), pFile);
printf("buf: %s, len: %d\n", buf, len);
}
fclose(pFile);
//读文件2 按行
// 每行最大长度不得超过 1024 字节
FILE* f = fopen("Group.txt","r");
char buf[1024];
while(fgets(buf,1024,f)){
cout << buf << endl;
}
//读文件3,特定行
// 每行最大长度不得超过 1024 字节
char* readLineChars(FILE* fp,int line){
char buf[1024];
for(int i=0;i<line;i++){
fgets(buf,1024,fp);
// 找到第 i 行
if(i == line-1){
// 去掉换行符
if(buf[strlen(buf)-1] == '\n'){
buf[strlen(buf)-1] = '\0';
}
// 移动文件指针到文件头
fseek(fp,0L,SEEK_SET);
return buf;
}
}
return "error";
}
//获取行长度
// 每行最大长度不得超过 1024 字节
int getLineNum(FILE* fp){
int result = 0;
char buf_group[1024];
while(fgets(buf_group,1024,fp)){
result++;
}
// 移动文件指针到文件头
fseek(fp,0L,SEEK_SET);
return result;
}
CFile
CFile类的声明保存在afx.h头文件中。
CFile类是MFC文件类的基类,提供非缓冲方式的二进制磁盘输入、输出功能;并直接通过派生类来支持文本文件和内存文件。提供访问本地文件内容的功能,不支持访问网络文件的功能。
CFile 类的成员变量:
m_hFile :表示一个打开文件的操作系统文件句柄。通过对 m_hFile 与 CFile::hFileNull 的比较来判断
该文件是否已经打开。
//第一个参数 文件路径 ,
//第二个参数 文件操作模式 列举常用的几种模式:
CFile::modeCreate 文件以创建形式打开(创建一个新的文件,老文件数据将会丢失 ,可以配合CFile::modeNoTruncate 一起使用,不会覆盖老文件)
CFile::modeRead 采用读取方式打开文件
CFile::modeWrite 采用写入方式打开文件
CFile::modeReadWrite 采用读写方式打开文件
CFile::modeNoTruncate 采用不截断形式打开文件(与CFile::modeCreate配合使用在文件存在的情况下不会创建新的文件, 与CFile::modeWrite配合使用在文件有数据的情况下写入数据不会清空文件数据(会存在数据覆盖现象,下面会讲文件写入位置设置方法))
CFile::modeNoInherit 防止这个将要被打开的文件来源于子进程(实际几乎用不到)
CFile::typeBinary 文件数据将会以二进制的形式显示
CFile::shareDenyNone 采用共享形式打开文件(这个文件在不做读写的情况下打开)
// 写文件
CFile file;
CFileException e;
CString str="d:file.txt";
if(!file.Open(str,CFile::modeCreate|CFile::modeWrite,&e))
{
printf("file could not be opened %d\n",e.m_cause);
return -1;
}
CString info="hello word\r\n";
file.Write(info,info.GetLength());
file.flush();
file.close();
//file.SeekToBegin();
//定位到文件开头
//读文件
CFile file;
CString str="d:file.txt";
if(!file.Open(str,CFile::modeRead))
{
printf("file could not be opened %d\n",e.m_cause);
return -1;
}
char GetStr[4096] = {0};
file_.Read(GetStr,4096);//这里读了4096个字节
file.flush();
file.close();
CStdioFile
CStdioFile继承自CFile,一个CStdioFile对象代表一个用运行时函数fopen 打开的C 运行时流式文件。流式文件是被缓冲的,而且可以以文本方式(缺省)或二进制方式打开。文本方式提供对硬回车—换行符对的特殊处理。当你将一个换行符(0x0A)写入一个文本方式的CStdioFile 对象时,字节对(0x0D,0x0A)被发送给该文件。当你读一个文件时,字节对(0x0D,0x0A)被翻译为一个字节(0x0A)。
下面展示一些 内联代码片
。
//写文件
CStdioFile file;
file.Open("ts.txt",CFile::modeCreate|CFile::modeWrite);
//写入文件
CString str;
str.Format("%s\r\n","hello!I am talkingmute!");
(在末尾添加\r\n会导致写出来的文档修改后出现格式错乱,只能写\n)
file.Seek(0,CFile::end);//定位位置
file.WriteString( str );
//关闭文件
file.Close();
//读文件的例子
CString strText = “”;
CString szLine = “”;
//打开文件
CStdioFile file;
file.Open("ts.txt",CFile::modeRead);
//逐行读取字符串
while( file.ReadString( szLine ) )
{
strText += szLine;
}
MessageBox(strText);
//关闭文件
file.Close();
File,CFile和CStdioFile区别:
一. CFile类操作文件默认的是Binary模式,CStdioFile类操作文件默认的是Text模式。
在Binary模式下我们必须输入’\r\n’,才能起到回车换行的效果,‘\r’只是回车(回到当前行的第一列),’\n’只是换行(到达下一行的当前列)。 而在Text模式下’\r’的工作是自动完成的,当我们写一个’\n’的时候,系统会自动帮我们在其前面加上一个’\r’,然后保存到文件里。另外,CFile::typeText只能在CFile的子类中使用,CFile自身的Read函数不能使用CFile::typeText和CFile::typeBinary
二. File 是C和C++的函数! mfc中使用了CFile类进行相同的文件操作功能!
CStdioFile继承了CFile 是CFile的子类,扩展了文本文件的操作,认识回车换行字符,可以进行一行字符串的读写!
三. Cfile类提供了基于二进制流的文件操作,功能类似于C语言中的fread()和fwrite()函数。CStdioFile提供了基于字符串流的文件操作,功能类似于C语言中的fgets()和fputs()函数。
四. CStdioFile继承了CFile类,特有的函数是ReadString(),WriteString(),但是不支持Duplicate(),Lockrange(),UnLockRange(),相当于流式文件的操作。
参考链接: https://blog.csdn.net/m0_46671092/article/details/107498443