请问为什么程序只执行了一次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 的返回值
网友回复:
引用 1 楼 Turntogo 的回复:
是不是只读到了一个“Rar!"呀?

第一个发送了指定字节的数,测试表明接收到的文件大小为1k,等于第一次read的大小。

读完close了吗?
或者你是在switch外面有while?
----------
read之后没有close
switch就是在消息的函数执行体里
网友回复:我想知道你switch(...)中的三个点的内容。
网友回复:这段代码看起来似乎很合理.

再多贴点看看
网友回复:
引用 1 楼 Turntogo 的回复:
是不是只读到了一个“Rar!"呀?

他说你的文件是不是只有一个。
你的程序似乎是把这个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
这该怎么解释呢?谢谢!
网友回复:
引用 7 楼 cinanynames 的回复:
引用 1 楼 Turntogo 的回复:
是不是只读到了一个“Rar!"呀?

他说你的文件是不是只有一个。
你的程序似乎是把这个RAR文件传送出去的意思。


是的,只传输一个rar文件,发现接收到的文件大小略大于原始文件,解压时说文件已损坏。。。
网友回复:
引用 9 楼 NKLoveRene 的回复:
你试试用二进制方式打开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个字符。改成二进制就应该没有问题了。
网友回复:属性:字符集:使用多字节字符集,试试。
网友回复:
引用 15 楼 Turntogo 的回复:
属性:字符集:使用多字节字符集,试试。

这个麻意思啊?不懂。。。 =,=
网友回复:
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测试的
网友回复:
引用 16 楼 Sco_field 的回复:
引用 15 楼 Turntogo 的回复:
属性:字符集:使用多字节字符集,试试。

这个麻意思啊?不懂。。。 =,=

点菜单:项目->属性
网友回复: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 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面