C/C++读写二进制文件
最近在给android层提供支持,因此代码都是用标准库库函数写出来的,好多windows和第三方的库不能或者很难使用,下面有我在读写二进制文件时候的一些心得,也算是一种总结吧
1、读二进制信息
1 bool bRet = true; 2 std::ofstream fout(szDestFile, std::ios::binary | std::ios::app); 3 std::ifstream fin(szOrigFile, std::ios::binary); 4 5 if (fin.bad()) 6 { 7 bRet = false; 8 } 9 else 10 { 11 while(!fin.eof()) 12 { 13 char szBuf[256] = {0}; 14 15 fin.read(szBuf, sizeof(char) * 256); 16 17 if (fout.bad()) 18 { 19 bRet = false; 20 break; 21 } 22 23 // 24 fout.write(szBuf, sizeof(char) * 256); 25 } 26 } 27 28 fin.close(); 29 fout.close();
这种方式读写二进制信息适用于读取一些二进制结构信息,如果读取像图片这样的二进制文件时,特别不方便,那么久需要一次性的读取文件的所有内容。
C++实现方式:测试通过
1 filebuf *pbuf; 2 ifstream filestr; 3 long size; 4 char * buffer; 5 // 要读入整个文件,必须采用二进制打开 6 filestr.open ("test.txt", ios::binary); 7 // 获取filestr对应buffer对象的指针 8 pbuf=filestr.rdbuf(); 9 10 // 调用buffer对象方法获取文件大小 11 size=pbuf->pubseekoff (0,ios::end,ios::in); 12 pbuf->pubseekpos (0,ios::in); 13 14 // 分配内存空间 15 buffer=new char[size]; 16 17 // 获取文件内容 18 pbuf->sgetn (buffer,size); 19 20 filestr.close(); 21 // 输出到标准输出 22 cout.write (buffer,size); 23 24 delete []buffer; 25 26 C方式: 27 FILE * pFile; 28 long lSize; 29 char * buffer; 30 size_t result; 31 32 33 pFile = fopen ("test.txt", "rb" ); 34 if (pFile==NULL) 35 { 36 fputs ("File error",stderr); 37 exit (1); 38 } 39 40 41 fseek (pFile , 0 , SEEK_END); 42 lSize = ftell (pFile); 43 rewind (pFile); 44 45 46 buffer = (char*) malloc (sizeof(char)*lSize); 47 if (buffer == NULL) 48 { 49 fputs ("Memory error",stderr); 50 exit (2); 51 } 52 53 54 result = fread (buffer,1,lSize,pFile); 55 if (result != lSize) 56 { 57 fputs ("Reading error",stderr); 58 exit (3); 59 } 60 61 printf("%s", buffer); 62 63 64 fclose (pFile); 65 free (buffer);
如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!!