c/c++文件操作笔记

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_SimpleLife

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值