UDP的通讯程序,其中要把Server和Client的接收和发送的数据以 数据长度(要求必须为int)+数据内容 (可以为char) 以二进制数据流的形式存储到各自的文件中。文件肯定为二进制文件。文件写入数据fp = fopen("客户端.bin","wb")。由于是wb,无法直接在文件末尾加数据,必须要将以前的数据也要保存下来,就要先进行一次read将原有数据保存在缓存区中,在fp = fopen("客户端.bin","wb")之后再写入。不过发现read出来的数据有问题,只读取了数据长度,数据长度后的00和数据内容都没有读取,read 的fp的指针只到数据长度就停止了。具体请看截图。求指导,怎样将数据完整的读出。程序如下,绝对无语法和赋值错误,应该是逻辑的问题,实在想不出来。
while(!feof(fp))
{
ch=fgetc(fp);
msg[count++]=ch;
} //读取原始数据,放入msg数组中
中间的程序都省略
fp = fopen("客户端.bin","wb"); //打开文件,必须存在,二进制存储
if(fp == NULL) {
printf("can not open file\n");
exit(0);
}
fwrite(msg,strlen(msg),1,fp); //写入原来的数据
fwrite(&sendinglen,sizeof(int),1,fp); //然后写入现在的数据长度
fwrite(buffer,sendinglen,1,fp); //最后写入数据内容
我认为一定是读取的问题,但是不知道该怎么弄,0A 00 00 00这种数据长度的结构,在while(!feof(fp)) 判断的时候就认为0A 后的00就是'\0',fscanf也一样,就判断结束了,请问该如何解决。在线等啊,解决了加分
ããfwrite()ä¸fprintf()æ¯ä¸åçã
ããfwriteå°åå ¥çæ°æ®ä½ä¸ºæ件çç£çå 容ä¿åãfprintfå°åå ¥çæ°æ®çæ¯ä¸ªå符æ对åºçASCIIç ä½ä¸ºæ件çç£çå 容ä¿åãfprintfåäºä¸ä¸ªè½¬æ¢çå·¥ä½ã
ããå½æå¼æ件æ¶ï¼è®°äºæ¬ä¼èªå¨ææ件çç£çå 容ä½ä¸ºASCIIç 转æ¢æ对åºçå符ï¼ç¶ååæ¾ç¤ºåºæ¥ï¼å³æ¾ç¤ºçæ¯ææ¬å 容èä¸æ¯ç£çå 容ã
ããä¾å¦ï¼ç¨fwriteåæ件åå ¥â65âæ¶ï¼æ件çç£çå 容就æ¯ä¿åç65ï¼ç£çä¸ä»¥äºè¿å¶è¡¨ç¤ºï¼ãå½ç¨è®°äºæ¬æå¼æ件æ¶ï¼è®°äºæ¬ä¼è¯»å°65ï¼å¹¶æ65çä½ä¸ä¸ªASCIIç ï¼åæ对åºçå符âAâæ¾ç¤ºåºæ¥ãå æ¤å±å¹ä¸çå°çææ¬å 容æ¯âAâã
ããèç¨fprintfåæ件åå ¥â65âæ¶ï¼æ件çç£çå 容ä¿åçæ¯â6âåâ5âè¿ä¸¤ä¸ªå符对åºçASCIIç ï¼åå«æ¯54å53ãå æ¤æ件çç£çå 容æ¯54å53ãå½ç¨è®°äºæ¬æå¼æ件æ¶ï¼è®°äºæ¬è¯»å°54ï¼å°±æ¾ç¤ºåºå¯¹åºçâ6âãå读å°53ï¼å°±æ¾ç¤ºåºå¯¹åºçâ5âã
fgetc只适合处理文本文件追问
我用的就是rb打开,读取的,而且查看的是fgetc能读二进制的。有没有什么读取方式是二进制写入追加的?我查了好像没查到。
追答不建议你使用fgetc,fgetc可以读二进制文件是没错,但二进制文件中有很多不是有效字符,处理起来就会出问题,比如0,10等控制字符
ab+ 为读/写打开一个二进制文件,位置指针移到到文件末位,可以添加也可以读;
rb+ 为读/写打开一个二进制文件,但此文件一定要存在
wb+ 为读/写新建一个二进制文件,会删除原有文件数据
上述方式是ANSIC规定的,不是所有的编译系统都支持的,你可以试一下
谢谢啦,直接就ab+,OK啦
本回答被提问者采纳数据长度(要求必须为int)+数据内容 (可以为char) 以二进制数据流的形式存储到各自的文件中
那么可以考虑以fread读取长度 然后再通过fread读出数据段
例如
while( fread( &data_len[i], sizeof(int) , 1 , fp )
{
fread( &data[i], data_len[i], 1, fp)
i++;
}追问
你牛B了,把我后面想干什么都猜出来了,呵呵,用ab+打开文件就可以了,谢谢啦
缓存:为了解决CPU速度和内存速度的速度差异而产生(CPU运算速度比内存快的多)
当程序需要读取某个文件时,实际就是把数据读入内存由CPU运算,CPU首先去缓存中找寻,查找不到就会到内存中去读取同时复制到缓存中以便下次访问,这个时候速度自然很慢,当你第二次读取该文件时,缓存中已经存在,CPU再次访问这些数据就会变的非常快。
这是和系统读取数据的方式有关的,并不是因为某个函数效率低的原因,比较明显的:
你在某个磁盘下搜索某一个文件名,第一次会比较慢,第二次就会快很多,原因就是第二次CPU需要处理的数据已经存在缓存中,处理时效率会非常高。