请问为什么程序只执行了一次read操作就读文件结束了?
时间:2008-05-09 09:22:47
来源:论坛整理 作者: 编辑:chinaitzhe
代码第一次进入case 0 里执行read操作,但第二次再进入case 0后就直接进入eof里,弹出:"文件发送结束!"
不知道为什么。
注:文件大小200多k
- C/C code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ #define BUF_SIZE 1000 s8 buffer[BUF_SIZE 1] = {0}; //缓存空间 u16 dwBufferNum = BUF_SIZE; //每次从文件中读取的字符个数 //其他初始值,非实际代码存放位置 m_bFileEnd = false; string str("课件.rar"); m_pInFile.open( str.c_str(), ios::in); switch( ... ) { case 0: //文件数据的传输过程 if ( m_pInFile.eof() )//判定文件是否已传输结束 { AfxMessageBox("文件发送结束!"); m_bFileEnd = true; //文件传输结束标志 return; } m_bFileEnd = false; //文件未传输结束 m_pInFile.read( buffer, dwBufferNum); //读文件 ...//传输文件数据 break; case 1: ...
网友回复:是不是只读到了一个“Rar!"呀?
网友回复:读完close了吗?
或者你是在switch外面有while?
把代码最好帖多点
网友回复:你看看 read 的返回值
网友回复:
第一个发送了指定字节的数,测试表明接收到的文件大小为1k,等于第一次read的大小。
读完close了吗?
或者你是在switch外面有while?
----------
read之后没有close
switch就是在消息的函数执行体里
网友回复:我想知道你switch(...)中的三个点的内容。
网友回复:这段代码看起来似乎很合理.
再多贴点看看
网友回复:
他说你的文件是不是只有一个。
你的程序似乎是把这个RAR文件传送出去的意思。
网友回复:哦,我把流文件换成二进制就可以了。
m_pInFile.open( str.c_str(), ios::in ¦ ios::binary);
但发现传送*.html *.txt文件是可以的,但发送 *jpeg *rar类型文件时打不开接收到的文件,经查,发现接收到的文件大小略大于发送的原始文件。不知道这是什么原因呢?希奇
注:我接收数据的程序代码是:m_outFile.write( (const char*)pMessage->content, pMessage->length);
这行有问题吗?
谢谢!
网友回复:你试试用二进制方式打开rar
网友回复:不要Unicode
网友回复:刚发现产生一个 502k的word文件时,接收到的文件大小时 504k,用word程序打开时报错。
而传输一个58k的txt文件时,接收正常,大小也是58k
这该怎么解释呢?谢谢!
网友回复:
是的,只传输一个rar文件,发现接收到的文件大小略大于原始文件,解压时说文件已损坏。。。
网友回复:
我发送程序以该方式创建:
- C/C code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ string str(cFileDlg.GetFileName()); m_pInFile.open( str.c_str(), ios::in | ios::binary); //建立流文件对应关系
接收程序以该方式创建:
- C/C code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ g_strFileName=cFileDlg.GetFileName(); m_outFile.open( g_strFileName.c_str(), ios::out | ios::binary); //建立流文件对应关系
请问有问题吗?
网友回复:RAR文件结构:
Rar! <EOF>...
第五个字符就是EOF了,所以我猜只读取4个字符。改成二进制就应该没有问题了。
网友回复:属性:字符集:使用多字节字符集,试试。
网友回复:
这个麻意思啊?不懂。。。 =,=
网友回复:
- C/C code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ void splitFile(string fileName, const int sizePerFile) { fileName = "e:\\fu.rar"; FILE* oldFile = fopen(fileName.c_str(), "rb"); char* partContent = new char[sizePerFile]; int numRead; FILE* newFile; char c[10]; int i = 0; while(numRead = fread(partContent, sizeof(char), sizePerFile, oldFile)) { // cout<<partContent<<endl; newFile = fopen((fileName string(itoa(i, c, 10))).c_str(), "wb"); fwrite(partContent, sizeof(char), numRead, newFile); fclose(newFile); i; } fclose(oldFile); delete[] partContent; }
这个似乎是我n久前写的一个拆分文件的代码
里面就用rar测试的
网友回复:
点菜单:项目->属性
网友回复:mark
网友回复:知道了症结所在了
s8 buffer[BUF_SIZE 1] = {0};
修改成s8 buffer[BUF_SIZE] = {0};
就可以了,多了个字符串结束符 =,=
现在能正常传输其他类型的文件了
网友回复:...不是字符串加什么字符串结束符... windows系统下还会根据扩展名,比如txt省略一些不可见字符.
- C/C code
Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ s8 buffer[BUF_SIZE 1] = {0};
上面这个写法在gcc/g 下编译等价于buffer[0] = 0; 建议用memset初始化
关键字:请问,程序,执行,一次,read,
上一篇:重载运算符后的继续问题
下一篇:下面没有链接了











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面