文件读写操作(转)
注意:本文内容均摘录至孙鑫老师的教程(可能有记录错误)
一、C语言的文件操作:(C语言中对文件的操作是利用FILE结构体完成的:)
//1.1.1 写入数据 FILE *pFile = fopen("1.txt","w"); fwrite("http://www.sunxin.org", 1, strlen("http://www.sunxin.org"), pFile); //移动文件指针到指定位置。 否则文件指针会一直在文件末尾,而写入操作会一直在文件尾追加内容。 fseek(pFile,0,SEEK_SET); //文件指针移动到文件起始位置。 fwrite("ftp:", 1, strlen("ftp:"),pFile); //fclose(pFile); //C语言对文件的操作使用了缓冲的文件系统。 fflush(pFile); //冲刷缓冲区中的数据,立即输出缓冲区的内容,而不必反复open和close;遇到需要及时刷新时,用fflush()
//1.1.2 C语言读取文件
//第一种 FILE *pFile = fopen("1.txt","r"); char ch[100]; memset(ch,0,100); //用指定的字符设定buffer; 将ch数组都设置为0后,读取内容会替换部分0,而没有替换的部分仍是0,剩余的第一个0就被识别为数组结束符。 fread(ch, 1, 100, pFile); MessageBox(ch); //当数组中有不可用的数据时会显示乱码。需要加上\0结尾才能正常显示(C语言中空就是0)。 fclose(pFile); //第二种 char* pBuf; fseek(pFile,0,SEEK_END); //移动文件指针到文件尾 int nLen = ftell(pFile); //得到文件长度 pBuf = new char[nLen + 1]; //得到内存的大小, nlen + 1 多分配一个字节用来存放\0; rewind(pFile); //将文件指针放到文件起始位置。 否则从文件尾无法读取到任何内容。 用fseek()也可以。 fread(pBuf,1,nLen,pFile); pBuf[nLen] = 0; //将最后一个字符设为0 MessageBox(pBuf); fclose(pFile);
1.2. 文件的分类:
文件是在计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式。
文件通常分为二进制文件和文本文件。
二进制文件是包含在 ASCII 及扩展 ASCII 字符中编写的数据或程序指令的文件。一般是可执行程序、图形、图象、声音等等文件。
文本文件(也称为ASCII文件):它的每一个字节存放的是可表示为一个字符的ASCII代码的文件。它是以 “行”为基本结构的一种信息组织和存储方式的文件,可用任何文字处理程序阅读的简单文本文件。
1.3.文本方式和二进制方式
当我们按照文本方式往文件中写入数据时,一旦遇到换行字符(ASCII为10),则会转换为回车-换行(ASCII为13、10)。在读取文件时,一旦遇到回车-换行的组合(即连续的ASCII 13、10),则会转换为换行字符(ASCII为10)。
当我们按照二进制方式往文件中写入数据,则将数据在内存中的存储形式原样输出到文件中。
1.4.文本方式和二进制方式读写:
//文本方式写入数据时存在转换, 二进制写入时没有转换。
//1.4.1 文本方式写入 FILE *pFile = fopen("2.txt","w"); char ch[3]; ch[0] = 'a'; ch[1] = 10; //当我们按照文本方式往文件中写入数据时,一旦遇到换行字符(ASCII为10),则会转换为回车-换行(ASCII为13、10)。在读取文件时,一旦遇到回车-换行的组合 //(即连续的ASCII 13、10),则会转换为换行字符(ASCII为10)。 //注意:无论是文本文件和二进制文件,都可以使用二进制方式打开,进行写入和读取,也都可以以文本方式打开,然后读取和写入。 //但以文本方式打开二进制文件时会产生错误。 ch[2] = 'b'; fwrite(ch, 1, 3, pFile); fclose(pFile);
//1.4.2 文本方式读取。 FILE *pFile = fopen("2.txt","r"); char ch[100]; fread(ch, 1, 3, pFile); //遇到13、10时自动转换为10,所以3个字符就够了。 ch[3] = 0; MessageBox(ch); fclose(pFile);
1.5.问题:
给你一个整数,例如:98341,将这个整数保存到文件中,要求在以记事本程序打开文件时,显示的是98341。
//1.5.1.错误写法 FILE *pFile = fopen("3.txt","w"); int i = 98341; fwrite(&i,4, 1, pFile); //错误写法,应该存储的是98341这5个字符的ASCII fclose(pFile);
//1.5.2.正确的,不用函数转换的方法 48 >= 数字字符ASCII的范围 <= 57 FILE *pFile = fopen("3.txt","w"); int i = 98341; char ch[5]; ch[0] = 9+48; ch[1] = 8+48; ch[2] = 3+48; ch[3] = 4+48; ch[4] = 1+48; fwrite(ch, 1, 5, pFile); fclose(pFIle);
//1.5.3.正确的,用函数转换的方法 FILE *pFile = fopen("3.txt","w"); int i = 98341; char ch[5]; itoa(i,ch,10); //将整数i转成10进制的字符。 fwrite(ch, 1, 5, pFile); fclose(pFile);
1.5.4 问题:给你一个文件,里面既有数字字符,又有26个英文字母的字符。让你判断哪些是数字字符??
方法:判断ASCII就行了 , 48 >= 数字字符ASCII的范围 <= 57
二、C++中文件流的操作
//2.1 C++中ofstream流写入文件 std::ofstream ofs("4.txt"); ofs.write("http://www.sunxin.org", strlen("http://www.sunxin.org")); ofs.close();
//2.2,C++中 std::ifstream流读取数据 std::ifstream ifs("4.txt"); char ch[100]; memset(ch, 0, 100); ifs.read(ch,100); ifs.close(); MessageBox(ch);
三、Win32 API中对文件的操作
//3.1 win32 API中对文件的操作 HANDLE hFile; hFile = CreateFile("5.txt", GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL); DWORD dwWrites; //接收实际写入的字节数 WriteFile(hFile, "http://www.sunxin.org",strlen("http://www.sunxin.org"), &dwWrites,NULL); CloseHandle(hFile);
//3.2 win32 API的文件操作 HANDLE hFile; hFile = CreateFile("5.txt",GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); char ch[100]; DWORD dwReads; ReadFile(hFile, ch, 100, &dwReads, NULL); ch[dwReads] = 0; CloseHandle(hFile); MessageBox(ch);
四、MFC cFile类对文件进行操作
//4.1 MFC对文件进行操作的类 cFile, cFile直接提供了没有缓冲的二进制的文件输入和输出。 MFC中文件编程时尽量用CFile来完成。 CFile file("6.txt",CFile::modeCreate | CFile::modeWrite ); file.Write("http://www.sunxin.org",strlen("http://www.sunxin.org")); file.Close();
//4.2 MFC对文件进行操作的类 cFile, cFile直接提供了没有缓冲的二进制的文件输入和输出 CFile file("6.txt", CFile::modeRead); char *pBuf; DWORD dwFileLen; dwFileLen = file.GetLength(); pBuf = new char[dwFileLen + 1]; pBuf[dwFileLen] = 0; file.Read(pBuf,dwFileLen); file.Close(); MessageBox(pBuf);
五、通过CFileDialog类增加打开对话框或保存文件对话框
//5.1,增加打开或保存文件对话框后,写入文件 CFileDialog fileDlg(FALSE); //FALSE:另存为对话框, TRUE:打开对话框 fileDlg.m_ofn.lpstrTitle = "my保存对话框"; fileDlg.m_ofn.lpstrFilter = "Text Files(*.txt)\0*.txt\0All File(*.*)\0*.*\0\0"; //要实现过滤功能,必须在过滤内容后加\0, 结束部分需要两个\0\0才可。 fileDlg.m_ofn.lpstrDefExt = "txt"; if (IDOK == fileDlg.DoModal()) { CFile file(fileDlg.GetFileName(), CFile::modeCreate | CFile::modeWrite); file.Write("http://sunxin.org",strlen("http://sunxin.org")); file.Close(); }
//5.2,增加打开或保存文件对话框后,读取文件 CFileDialog fileDlg(TRUE); fileDlg.m_ofn.lpstrTitle = "my打开对话框"; fileDlg.m_ofn.lpstrFilter = "Text Files(*.txt)\0*.txt\0All File(*.*)\0*.*\0\0"; //要实现过滤功能,必须在过滤内容后加\0, 结束部分需要两个\0\0才可。 fileDlg.m_ofn.lpstrDefExt = "txt"; if (IDOK == fileDlg.DoModal()) { CFile file(fileDlg.GetFileName(), CFile::modeRead); char *pBuf; DWORD dwFileLen; dwFileLen = file.GetLength(); pBuf = new char[dwFileLen + 1]; pBuf[dwFileLen] = 0; file.Read(pBuf,dwFileLen); file.Close(); MessageBox(pBuf); }
六:ini配置文件的读写
//6.1写入ini文件 ::WriteProfileString("http://sunxin.org", "admin", "zhangsan"); //6.2读读ini文件 CString str; ::GetProfileString("http://sunxin.org", "admin", "lisi", str.GetBuffer(100),100); AfxMessageBox(str);
七:注册表的读写
//7.1 读写配置文件方式来修改注册表,(只能读写字符串类型的值)
SetRegistryKey(_T("http://sunxin.org")); //指定注册表的键 //7.1.1 写入注册表 WriteProfileString("http://sunxin.org", "admin", "zhangsan"); //7.1.2 读取注册表 CString str; str = GetProfileString("http://sunxin.org","admin"); AfxMessageBox(str);
//7.2 注册表写入方式, 第二种写入注册表方法 HKEY hKey; DWORD dwAage= 30; RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\http://www.sunxin.org\\admin",&hKey); //创建一个注册表项 RegSetValue(hKey, NULL, REG_SZ, "lisi", strlen("lisi")); //“默认” 就是没有名字的。 RegSetValue()只能读写字符串的数据 RegSetValueEx(hKey,"age",0,REG_DWORD,(CONST BYTE*)&dwAage,4); //RegSetValueEx()可以写入所有类型的注册表项的值 RegCloseKey(hKey);
//7.2 注册表写入方式, 第二种写入注册表方法 HKEY hKey; DWORD dwAage= 30; RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\http://www.sunxin.org\\admin",&hKey); //创建一个注册表项 RegSetValue(hKey, NULL, REG_SZ, "lisi", strlen("lisi")); //“默认” 就是没有名字的。 RegSetValue()只能读写字符串的数据 RegSetValueEx(hKey,"age",0,REG_DWORD,(CONST BYTE*)&dwAage,4); //RegSetValueEx()可以写入所有类型的注册表项的值 RegCloseKey(hKey);
//7.3.1 注册表读取方式,第一种:RegQueryValue()只能读取字符串类型的值 LONG lValue; //第一次调用获取数据长度。RegQueryValue()中 参数3为null时,第4个参数会返回数据长度+1个终止符 RegQueryValue(HKEY_LOCAL_MACHINE,"Software\\http://www.sunxin.org\\admin",NULL ,&lValue); char *pBuf = new char[lValue]; RegQueryValue(HKEY_LOCAL_MACHINE,"Software\\http://www.sunxin.org\\admin",pBuf, &lValue); //第二次通过长度,获取值。 MessageBox(pBuf);
//7.3.2 注册表读取方式,第二种:RegQueryValueEx()可以读所有类型的值 HKEY hKey; RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\http://www.sunxin.org\\admin",&hKey); DWORD dwType; DWORD dwValue; DWORD dwAge; RegQueryValueEx(hKey,"age",0,&dwType,(LPBYTE)&dwAge,&dwValue); //读取所有支持的字符串类型的值 CString str; str.Format("age = %d",dwAge); MessageBox(str); }

浙公网安备 33010602011771号