| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1063 人关注过本帖
标题:【stack】为什么读取文件时候最后一个字符总是会读两遍?
取消只看楼主 加入收藏
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
结帖率:96.08%
收藏
已结贴  问题点数:20 回复次数:6 
【stack】为什么读取文件时候最后一个字符总是会读两遍?
代码:
    do
    {
        char tempChar;
        sourceFile>>tempChar;
        cout<<"读入的字符:"<<tempChar<<endl;
        ElemType tElem;
        tElem.changeElem(tempChar);
        if((tempChar=='(')||(tempChar==')')||(tempChar=='{')||(tempChar=='}')||(tempChar=='[')||(tempChar==']'))
        {
            if(stack.isEmpty())
            {
                stack.push(tElem);

                cout<<"isEmpty   in"<<endl;/////////
                continue;
            }

            if(isMatch(tempChar,stack.peek().getElem()))
            {
                stack.pop();
                cout<<"out"<<endl;/////
            }
            else
            {
                stack.push(tElem);
                cout<<"different   in"<<endl;/////////
            }

        }
    } while(!sourceFile.eof());



目的:判断文件中括号是否配对。

测试:

输入文件名:test.txt
读入的字符:(
isEmpty   in
读入的字符:(
different   in
读入的字符:(
different   in
读入的字符:{
different   in
读入的字符:}
out
读入的字符:[
different   in
读入的字符:[
different   in
读入的字符:[
different   in
读入的字符:]
out
读入的字符:]
out
读入的字符:]
out
读入的字符:)
out
读入的字符:)
out
读入的字符:)
out
读入的字符:)
isEmpty   in
0请按任意键继续. . .


test.txt文本内容:
((({}[[[]]])))


其他参考定义内容:

class Stack
{
public:
    Stack(){top=0;}
    ~Stack(){}
    void initStack(){top=0;}
    void push(ElemType item)
    {
        if(top==MaxSize)
        {
            cout<<"栈溢出!"<<endl;
            return;
        }
        top++;
        elem[top]=item;
    }
    ElemType pop()
    {
        ElemType tempElem;
        if(top==0)
        {
            cout<<"栈已空!"<<endl;
            return tempElem;
        }
        tempElem=elem[top];
        top--;
        return tempElem;
    }
    ElemType peek(){return elem[top];}
    bool isEmpty(){return !top;}
    void ClearStack(){top=0;}
private:
    int top;
    ElemType elem[MaxSize+1];
};
搜索更多相关主题的帖子: continue 
2014-01-12 14:47
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
#include<iostream>
#include<fstream>
using namespace std;

int main()
{
    ifstream f;
    f.open("test.txt",ios::in);

    do
    {
        char c;
        f>>c;
        cout<<c<<endl;
    } while (!f.eof());

    f.close();


    f.open("test.txt",ios::in);

    while (!f.eof())
    {
        char c;
        f>>c;
        cout<<c;
    }
    return 0;
}


实验证明我写的文件读取方式确实有问题

可是这是为什么呢?


还真不知道为什么要有空行。。。头一次听说。

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-01-12 17:34
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
百度了一下:编译器需要文件最后有一个回车,作为文件结尾。

我在文件后加了回车,可是情况依然是这样的,最后一个字符会读两遍。

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-01-12 17:36
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
#include<iostream>
#include<fstream>
using namespace std;

int main()
{
    ifstream f;
    f.open("test.txt",ios::in);

    do
    {
        char c;
        //f>>c;
        f.get(c);
        cout<<c;
    } while (!f.eof());

    f.close();


    f.open("test.txt",ios::in);

    while (!f.eof())
    {
        char c;
        //f>>c;
        f.get(c);
        cout<<c;
    }
    return 0;
}


代码经修改如上是正确的。
注:test.txt内容如下:
hello world
------>  一个空行

输出如下:
hello world!

hello world!

请按任意键继续. . .


依然不太明白为什么get是对的,直接f>>就是会把最后一个字符读两遍的。

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-01-12 17:46
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
“eof,是要在讀寫指針越過之後還繼續讀取時才反饋回來的”------》原来这样~

谢谢斑竹~

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-01-12 17:48
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
while(get() && !feof())

嗯,学习了~


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-01-12 17:55
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
收藏
得分:0 
在处理二进制文件的时候,就一再被警告不要使用eof来检验文件尾。

还真不知道这里面还有这么多讲究。


学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2014-01-12 18:05
快速回复:【stack】为什么读取文件时候最后一个字符总是会读两遍?
数据加载中...
 
   



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

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