LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1504|回复: 21

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

[复制链接]
发表于 2004-8-4 01:18:08 | 显示全部楼层 |阅读模式
我对文件进行读操作,但我读出来的比实际的多一个字符,跟踪后发现字符的ASIC码为10,也就是\n,但我的文件中最后并没有回车换行,我把文件的内容删了一些后保存以确保结尾没有\n,但读出来后还是有.这样不论读出来显示,还是另外存放都在最后一个乱码,请问如何解决这个问题
发表于 2004-8-4 08:05:38 | 显示全部楼层
代码呢?
发表于 2004-8-4 08:29:40 | 显示全部楼层
不要最后一个不行吗?
如果读出来成字符串,就把最后的'\n'改成'\0'
发表于 2004-8-4 10:23:41 | 显示全部楼层
你都不说一下到底是用ASCII方式还是BIN方式读取文件的。
 楼主| 发表于 2004-8-4 11:09:14 | 显示全部楼层
我编了两个,都是一样的问题,程序和运行结果如下:
一:
int main()
{
        FILE *fp1,*fp2;
        char data[10];
        fp1=fopen("/root/test.txt","r");
        fp2=fopen("/root/copy.txt","w");
        while(!feof(fp1))
                putchar(getc(fp1));       

        rewind(fp1);
        while(!feof(fp1))
                putc(getc(fp1),fp2);
        fclose(fp1);
        fclose(fp2);

        return 0;
}
运行结果是:
[root@localhost learn]# ./kk
abcdefg
?[root@localhost learn]#
我在test.txt中的写的内容是:abcdefg
运行后copy.txt的内容是:
abcdefg
ÿ
二:
#include<stdio.h>
#include<string.h>
#include <fcntl.h>
int main()
{
        int fb;
        char buf[10];
       
        if((fb = open("/root/test.txt",O_RDONLY)) == -1)
                printf("open error!\n");
        else
        {
                read(fb,buf,9);
                buf[9] = 0;
                printf("%s",buf);
        }
       
        close(fb);
       
        if((fb = open("/root/copy.txt",O_WRONLY | O_CREAT)) == -1)
                printf("open error!\n");
        else
        {
                write(fb,buf,strlen(buf));
        }
}
运行结果是:
[root@localhost learn]# ./kk
abcdefg
[root@localhost learn]#
运行后copy.txt的内容是:
abcdefg

运行后再打开test.txt发现它确实多了一个换行,我只对它进行了读操作,它怎么会变呢
 楼主| 发表于 2004-8-4 11:11:58 | 显示全部楼层

to doubleelec

如果我文件中间有换行怎么办,那样我岂不是只能读一行了
 楼主| 发表于 2004-8-4 11:16:07 | 显示全部楼层

to Sworder版主

我刚开始学,还不知道什么是用ASCII方式读取,什么是BIN方式读取.麻烦你教我一下,好吗!
发表于 2004-8-4 12:06:47 | 显示全部楼层
记得声明了变量,在使用前要初始化先。
第二个使用buf前,加个memset(buf,0,sizeof(buf);然后就一切正常了。
发表于 2004-8-4 12:37:50 | 显示全部楼层
不好意思,俺一向懒得看别人的代码。就跟你说说C语言对文件的两种操作方式吧。其实准确的说,应该是C的库函数stdio对文件的两种操作方式。一般来说,打开和关闭一个文件在C语言里面是使用文件指针的方式进行的。也就是fopen和fclose。在fopen之后,你会得到一个FILE*类型的变量,也就是你要操作的文件的指针。然后可以用两种方式对它操作。也就是ASCII和BINARY这两种。首先你应该明白的是,文件,不管它包含的是一篇文本方式的色情小说还是一部RM格式的A片,在计算机看来,它只是一大堆二进制的组合。如果你用ULTER EDIT以hex方式打开它们,那么只能看到一堆0xFF 0xEC 0x18之类的东西。当然了,文本文件中的回车换行符号也是二进制代码。不过,不同的系统,对回车换行有不同的理解。在DOS下面,它们是两个16进制符号:0x0D 0x0A。在UNIX下面,它们只用一个符号表示,是:0x0A(可能是0x0A,我也忘记了,哈哈。你可以google一下)所以,对于C的文件操作函数来说,衍生出了一种ASCII处理方式。以适用不同环境下,不同的回车换行符号。一般是fgets fputs。它们能够一次读取一行字符串,一直读到遇到回车换行符号位置。但是它们返回的字符串指针里面却不包含回车换行符号。同样的,你用fputs写入文件的时候,也不需要自己再加入任何回车换行符号,函数自己会帮你加的。这些函数在你处理纯文本文件的时候确实会有些便利,可是再某些系统上面,它对中文汉字的辨认能力却有问题。因为汉字的编码范围超过了ASCII编码的范围,函数有可能把汉字的字符认为不是字符串,而造成错误。
反正,我是不喜欢用ASCII方式的,我只用BINARY方式,也就是fread fwrite这两个函数。它们可以控制一次读入的数据的长度,自己掌握读取写入缓冲区的大小。支持把各种数据类型写入文件,包括struct结构。至于上面提到的回车换行问题,只要自己稍微注意一下,不难解决的。使用BIN方式,你才有一种全面凌驾文件操作的感觉。天上天下,惟我独尊。普天之下,莫非王土;率土之濱,莫非王臣。瓦哈哈哈哈。。。。
发表于 2004-8-4 12:42:52 | 显示全部楼层
实现ftp协议的时候就逃不过去了,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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