关于用FILE读非文本文件的问题

cwbcwb505 2009-01-13 11:19:37
以下是我的代码:
FILE* fp = NULL;
char* lcpBuff;
int lnSize = 1024;
string lstrBuf;

lstrBuf.clear();
fp = fopen("文件名", "rb");
while(!feof(fp))
{
lcpBuff = new char[lnSize+1];
memset(lcpBuff, 0, lnSize+1);
fread(lcpBuff, 1, 1024, fp);
lstrBuf += lcpBuff;
delete lcpBuff;
lcpBuff = NULL;
}

以是就是我读整文件的代码,在读文本文件的时候正常,比如说txt文件,但是读非文本文件的时候就不对了,读进来的东西要少好多,比如说rar文件,请问这是怎么回事,我以上的代码问题出在哪里呢?应该如何解决呢?
请给出示例代码,最好是能运行成功的代码段,谢谢!
...全文
185 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Darkneece 2009-01-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cwbcwb505 的回复:]
谢谢各位的回答,不过看了这么多例子,都是及时读进来,再及时写出去了,没有涉及到在内存中的处理,我要读的文件是不知道它有多大的,所以我只能一次读自定义的多少个,然后将它们存到一个地方,然后再将它们连起来,再将它发送到网上去,可我就是不知道如何处理这些字符的东西,请问应该怎么弄呢?
[/Quote]

fseek(file, 0, SEEK_END);
size = ftell(file);


size就是文件大小
handsomepx 2009-01-15
  • 打赏
  • 举报
回复
mark
dumeifang 2009-01-15
  • 打赏
  • 举报
回复
学习了。
helenhf 2009-01-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cwbcwb505 的回复:]
谢谢各位的回答,不过看了这么多例子,都是及时读进来,再及时写出去了,没有涉及到在内存中的处理,我要读的文件是不知道它有多大的,所以我只能一次读自定义的多少个,然后将它们存到一个地方,然后再将它们连起来,再将它发送到网上去,可我就是不知道如何处理这些字符的东西,请问应该怎么弄呢?
[/Quote]
一定要先读到一个地方的话调用realloc()动态申请内存好了
realloc( ) - reallocate a block of memory (ANSI)
void *realloc
(
void * pBlock, /* block to reallocate */
size_t newSize /* new block size */
)

submarine2007 2009-01-14
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cwbcwb505 的回复:]
我要读的文件是不知道它有多大的,所以我只能一次读自定义的多少个,然后将它们存到一个地方,然后再将它们连起来,再将它发送到网上去,可我就是不知道如何处理这些字符的东西,请问应该怎么弄呢?
[/Quote]

这种情况下, 你有必要全部都读到内存中么? 你为什么不试试读一块发送一快呢?
xiaoyisnail 2009-01-13
  • 打赏
  • 举报
回复
给你写了个例子,参考参考吧

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

int main()
{
FILE* fp1 = NULL, *fp2 = NULL;

int lnSize = 1024;
char* lcpBuff = NULL;
int num = 0;

fp1 = fopen("in.rar", "rb");
if(!fp1)
{
printf("error\n");
exit(1);
}

fp2 = fopen("out.rar", "wb");
if(!fp2)
{
printf("error\n");
exit(1);
}

lcpBuff = new char[lnSize+1];
memset(lcpBuff, 0, lnSize+1);
while(num=fread(lcpBuff, 1, 1024, fp1))
{
fwrite(lcpBuff, 1, num, fp2);
memset(lcpBuff, 0, lnSize+1);
}

delete [] lcpBuff;

return 0;
}
ckt 2009-01-13
  • 打赏
  • 举报
回复

#include "string.h"

#define SRC_FILE_NAME "d:\\pcm.rar"
#define DEST_FILE_NAME "d:\\copypcm.rar"

int main(int argc, char* argv[])
{
FILE* fpSrc = fopen(SRC_FILE_NAME, "rb");
if (!fpSrc)
return 0;
FILE* fpDest = fopen(DEST_FILE_NAME, "wb");
if (!fpDest)
return 0;
int iRet = 0;
char sTmp[1024] = {0};
while (true){
memset(sTmp, 0, sizeof(sTmp));
iRet = fread(sTmp, 1, sizeof(sTmp), fpSrc);
// 处理读到的iRet个字
// ...
fwrite(sTmp, 1, iRet, fpDest);
if (iRet != sizeof(sTmp)) // 读到尾部
break;
}
fclose(fpSrc);
fclose(fpDest);
return 0;
}
ckt 2009-01-13
  • 打赏
  • 举报
回复
没搞明白,为什么你要把读出来的内容存储到string中,
如果你读出来的值形如"abcdef\0gg",即内容中就有结束符,这样你只是存储了一段("abcdef")到string中.
lann64 2009-01-13
  • 打赏
  • 举报
回复
用这个程序测试了一下读rar文件,复制出的文件跟原文件完全一致。

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

int main()
{
FILE* fp = NULL,*fp1=NULL;
char* lcpBuff;
int lnSize = 1024;

fp = fopen("t.rar", "rb");
fp1=fopen("tt.rar","wb");
while (!feof(fp))
{
lcpBuff = new char[lnSize+1];
memset(lcpBuff, 0, lnSize+1);
fread(lcpBuff, 1, 1024, fp);
fwrite(lcpBuff,1,1024,fp1);
delete[] lcpBuff;
lcpBuff = NULL;
}
}
xiaoyisnail 2009-01-13
  • 打赏
  • 举报
回复
所以不能使用+=来连接字符串,因为你此时处理的已经不再是字符串了
lann64 2009-01-13
  • 打赏
  • 举报
回复
你不能用string lstrBuf;这个来处理二进制数据。
xiaoyisnail 2009-01-13
  • 打赏
  • 举报
回复
你这样读二进制文件内容到lcpBuff,然后lstrBuf += lcpBuff肯定是不对的,只要文件里有'\0',虽然是保存在lcpBuff中,但在lstrBuf += lcpBuff时当遇到第一个'\0'时该语句就退出了,lcpBuff出剩下的数据就被丢弃了,所以会出现你说的情况
submarine2007 2009-01-13
  • 打赏
  • 举报
回复
原因在于你按照处理字符的方式来处理二进制文件,比如:

lstrBuf += lcpBuff, lcpBuff中的'\0'也就是0, 会中断 +=
lann64 2009-01-13
  • 打赏
  • 举报
回复
应该不会。你是怎么看的读进来的东西少了?
应该检查fread实际读入的字节数。要是串输出lcpBuff当然不行,那是按照字符串处理的。

另外,你的delete好像不对,应该是delete[]
  • 打赏
  • 举报
回复
晕,你试过读取rar文件?人家是经过压缩编码的,你说的"读进来的东西要少好多"是相对什么而言少很多?
cwbcwb505 2009-01-13
  • 打赏
  • 举报
回复
谢谢各位的回答,不过看了这么多例子,都是及时读进来,再及时写出去了,没有涉及到在内存中的处理,我要读的文件是不知道它有多大的,所以我只能一次读自定义的多少个,然后将它们存到一个地方,然后再将它们连起来,再将它发送到网上去,可我就是不知道如何处理这些字符的东西,请问应该怎么弄呢?
goodcook 2009-01-13
  • 打赏
  • 举报
回复
mark & 学习
neeestth 2009-01-13
  • 打赏
  • 举报
回复
学习。
tanmeining 2009-01-13
  • 打赏
  • 举报
回复
lstrBuf += lcpBuff;
不能这样去处理

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧