LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: xyh_xkt

为什么我从文件中读出来的比实际的多

[复制链接]
发表于 2004-8-4 12:49:59 | 显示全部楼层
FTP协议中也就是一个自动转换回车换行符号的功能而已。其实这种功能可以直接做在FTP客户端里面,而不需要做在FTP传输代码里面。因为DOS下的FTP客户端绝对不会被使用到UNIX下面,客户端是依赖于OS的。只不过,以前大家都是那样做的,思路被限定死了。
发表于 2004-8-4 13:35:36 | 显示全部楼层
问题出在这里:
应该把
while(!feof(fp1))
putchar(getc(fp1));
改成
int c;
while((c=getc(fp1)) != EOF)
        putchar(c);

因为那个feof()是在读写出错以后判断错误状态的,
并不能预先知道文件指针已到文件尾
发表于 2004-8-4 13:47:53 | 显示全部楼层
最初由 Sworder 发表
FTP协议中也就是一个自动转换回车换行符号的功能而已。其实这种功能可以直接做在FTP客户端里面,而不需要做在FTP传输代码里面。因为DOS下的FTP客户端绝对不会被使用到UNIX下面,客户端是依赖于OS的。只不过,以前大家都是那样做的,思路被限定死了。


ftp协议同时定义了server和client的。
而且这个转换是必须在server和client同时进行的,因为是协议的规定
[PHP]
         3.1.1.1.  ASCII TYPE

            This is the default type and must be accepted by all FTP
            implementations.  It is intended primarily for the transfer
            of text files, except when both hosts would find the EBCDIC
            type more convenient.

            The sender converts the data from an internal character
            representation to the standard 8-bit NVT-ASCII
            representation (see the Telnet specification).  The receiver
            will convert the data from the standard form to his own
            internal form.

            In accordance with the NVT standard, the <CRLF> sequence
            should be used where necessary to denote the end of a line
            of text.  (See the discussion of file structure at the end
            of the Section on Data Representation and Storage.)

            Using the standard NVT-ASCII representation means that data
            must be interpreted as 8-bit bytes.

            The Format parameter for ASCII and EBCDIC types is discussed
            below.
[/PHP]
发表于 2004-8-4 14:00:37 | 显示全部楼层
我的意思是,FTP协议只需要告诉下载客户端,当前的传送方式是不是ASCII方式就可以了。然后转换回车换行的工作交给客户端。所以处理的时候完全不需要文本方式的C函数fgets fputs参与操作。
发表于 2004-8-4 14:10:30 | 显示全部楼层
不仅仅是crlf这么简单的。不同机器甚至ascii的表示都不同。你按照你的方式传过去了,client不一定识别啊。所以才规定了先转到NVT-ASCII再传,client收到以后,再按照自己的格式来保存。而这个NVT-ASCII规定了必须使用crlf表示end-of-line。server是逃不过去的。仔细看看协议的3.1节就理解了。
发表于 2004-8-4 14:15:29 | 显示全部楼层
西西。。。没玩过FTP程序,纸上谈兵了。
网络世界真麻烦,还是俺滴嵌入式好玩,普天之下,尽在掌握,耶~~
发表于 2004-8-4 14:19:59 | 显示全部楼层
是啊,机器太多了极度麻烦的。光是一个字节序不注意就会被搞死了,而且还很难发现怎么死的。真是佩服那些制定协议的可以考虑那么周到。
btw,ftp协议的实现是我们网络课的一个实验。不过应该几乎所有的同学都没有完全实现了的。只是做到自己的client可以和标准的server交互,自己的server可以为标准client提供服务。
发表于 2004-8-4 14:35:20 | 显示全部楼层
最初由 lucifer 发表
是啊,机器太多了极度麻烦的。光是一个字节序不注意就会被搞死了,而且还很难发现怎么死的。真是佩服那些制定协议的可以考虑那么周到。
btw,ftp协议的实现是我们网络课的一个实验。不过应该几乎所有的同学都没有完全实现了的。只是做到自己的client可以和标准的server交互,自己的server可以为标准client提供服务。

人家靠这个吃饭滴~~
想的自然比WAPI之类的多一点咯;)

不过我们也要锻炼自己的这种能力哦,不能老是要人家“帮”我们想好吧:cool:
发表于 2004-8-4 14:40:47 | 显示全部楼层
说起来,自己想个啥子东西,看着别人拼命实现,然后再去挑个错之类,也很爽的说
 楼主| 发表于 2004-8-4 15:24:09 | 显示全部楼层

谢谢各位大侠

谢谢lucifer,我从你的方法中找到了我的错误,就是实际上只读了8个字符,而当成读了9个,所以就有一个乱码了,我改成了这样也实现了:
int n;
n = read(fb,buf,9);
buf[t] = 0;
谢谢Sworder版主,你教了我不少文件操作的知识.
谢谢doubleelec,你的方法也不错,可我不是很清楚,为什么feof的说明就是用来检测文件结束标志的,却不能用来检测文件结束标志.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表