| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 586 人关注过本帖, 1 人收藏
标题:feof()函数判断是否读到数据末尾,为什么读不到空字符呢?读不到,那为什么 ...
只看楼主 加入收藏
任重道远
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2015-9-12
结帖率:66.67%
收藏(1)
 问题点数:0 回复次数:9 
feof()函数判断是否读到数据末尾,为什么读不到空字符呢?读不到,那为什么读的字符总长度是字符串长度加1呢?详见代码,还有问题,求帮忙。
/*打开一个现有文本文件,将所有的小写字母转换为大写,然后将其拷贝至新的文本文件中。*/
#include <stdio.h>
#include <stdlib.h>

void copy_file(char old[],char new[]);

FILE *fold,*fnew;

int main(void)
{
    char buf[40];
    char newname[10];
    int count=0,a=0;
    char ch;

    if((fold=fopen("a.txt","r"))==NULL)
    {
        fprintf(stderr,"Error opening file.");
        exit(-1);
    }
    rewind(fold);

    while(1)
    {
        if(!feof(fold))
        {
            if((ch=fgetc(fold))=="\0")     //防止空字符进行-32的转换,,但是为什么读取不到?  
                break;
            else
                buf[count++]=ch-32;
                a++;                    //a为对读到的字符计数。
        }
        else
            break;
    }
    fclose(fold);
    a-=1;                        //去除空字符
    for(count=0;count<a;count++)
    {
        printf("\nbuf[count]=%c",buf[count]);
    }

    printf("\nEnter newname...");
    gets(newname);

    copy_file(buf,newname);

    getchar();
    return 0;
}

void copy_file(char old[],char new[])
{
    if((fnew=fopen(new,"w"))==NULL)
    {
         fprintf(stderr,"Error opening file.");
         exit(-1);
    }
    fputs(old,fnew);

    fclose(fnew);
}
在程序下建一个记事本文件输入abcdehahaha;但程序运行结果是在另一个文件中存入了ABCDEHAHAHA?bw腫w?@
是在是不懂,请高手帮助。
2015-09-17 20:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
谁告诉你必定有'\0'字符的?

授人以渔,不授人以鱼。
2015-09-17 21:27
任重道远
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2015-9-12
收藏
得分:0 
回复 2楼 TonyDeng
比如说读取abcde的长度用feof()这样读:
while(1)
     {
         if(!feof(fold))
         {
            a++;
         }
最后的a值为6,所以说应该会读字符串末尾的空字符。
2015-09-17 21:35
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
feof()是在发生读写错误时返回真,此时错误已经发生,不是你读到了什么。

授人以渔,不授人以鱼。
2015-09-17 21:37
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
发生错误时,文件指示器已经越界,而你的计数器却仍然加1,是自己算错了,而不是读到了结束符,读到的是不可预测内容。

授人以渔,不授人以鱼。
2015-09-17 21:44
任重道远
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2015-9-12
收藏
得分:0 
回复 4楼 TonyDeng
哦,用feof()查看是否到数据末尾,是通过位置指示符来控制,那当位置指示符移到空字符时,feof()依然返回0;
那么这个时候为什么用ch=fgetc(fold))访问不到‘/0’?当时位置指示符还在那啊,这个有点不懂。。。
2015-09-17 21:46
任重道远
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2015-9-12
收藏
得分:0 
回复 5楼 TonyDeng
哦哦  明白了,那具体应该怎么做,来让文件正常复制过去
2015-09-17 21:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
1.在文件中是否存在C字符串的'\0',是由写文件的方式决定,不是必定存在。
2.读写文件数据,利用读写函数的返回值,不是用feof()。

授人以渔,不授人以鱼。
2015-09-17 21:50
任重道远
Rank: 1
等 级:新手上路
帖 子:57
专家分:7
注 册:2015-9-12
收藏
得分:0 
回复 8楼 TonyDeng
嗯嗯明白了 非常感谢
2015-09-17 21:53
来生再见
Rank: 1
来 自:江西省抚州市
等 级:新手上路
威 望:1
帖 子:39
专家分:9
注 册:2015-9-13
收藏
得分:0 
以下是引用任重道远在17/9/2015 21:35:31的发言:

比如说读取abcde的长度用feof()这样读:
while(1)
     {
         if(!feof(fold))
         {
            a++;
         }
最后的a值为6,所以说应该会读字符串末尾的空字符。

其实你说的这个问题我前几天也和你一样
你这个问题和空字符半毛钱关系都没有
真正出问题是文件末尾的问题
http://

feof()判断函数的末尾:当把文件字符全部读完的时候,在读的话,就会设置feof()等于非0,
看上面的那个链接就知道,
fp:指向1.txt
1.txt :123456
程序代码:
    while(!feof(fp)){
        fseek(fp,1L,SEEK_CUR);
        printf("i:%d:   feof:%d\n",i,feof(fp));
        i++;
        if(i==6){
            fgetc(fp);
        }
        
    }
i==6 fgetc(fp)获取一个字符,feof()d就等于非0了,退出循环


重新开始,努力
2015-09-21 21:15
快速回复:feof()函数判断是否读到数据末尾,为什么读不到空字符呢?读不到,那为 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.029647 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved