C++ ifstream在我的代码中不工作?

C++ ifstream在我的代码中不工作?,c++,ifstream,C++,Ifstream,我的代码没有像我预期的那样输出main.cpp的前10行。请告诉我为什么。谢谢 #include "TStack.h" #include <fstream> #include <iostream> #include <string> using namespace std; int main(int argc, char* argv[]) { ifstream in("main.cpp"); Stack<string> textl

我的代码没有像我预期的那样输出main.cpp的前10行。请告诉我为什么。谢谢

#include "TStack.h"
#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main(int argc, char* argv[]) {
    ifstream in("main.cpp");
    Stack<string> textlines;
    string line;
    while (getline(in, line)) {
        textlines.push(new string(line));
    }
    string* s;

    for (int i = 0; i < 10; i++) {
        cout << "1" << endl;
        if((s = (string*)textlines.pop())==0) break;
        cout << *s << endl;
        delete s;
    }


}
#包括“TStack.h”
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[]){
ifstream in(“main.cpp”);
堆叠文本行;
弦线;
while(getline(in,line)){
push(新字符串(行));
}
字符串*s;
对于(int i=0;i<10;i++){

coutEhm…那要看情况而定。
Stack
做什么?它打印多少个
“1”
s?一个还是十个

Stack
看起来很奇怪:如果
pop
是以
字符串为模板的,那么为什么需要对其进行强制转换?我相信
pop
不会返回您认为它返回的结果

编辑

我复制了你的代码,得到了10个“1”,有行。我实际上得到了文件的最后10行,顺序相反(这对你来说是一个很好的练习——找出它,这很有意义)

如果没有任何行,只有1“1”,我猜程序找不到文件(可执行文件是从不同的目录执行的)


尝试将打印添加到
getline
循环中,看看您实际读取了多少行。

您的堆栈假设(我没有完全检查它是否正确实现)使用后进先出原则(最后输入第一输出)因为堆栈应该根据定义工作。所以您不应该期望前10个pop将返回前10行,它将返回最后一行。所以您可以使用FIFO容器或pop堆栈,直到您获得其中的最后10个项目(但顺序仍然相反).

顺便说一句,我用的是Xcode。我们不知道堆栈是如何工作的,那么我们怎么才能告诉你什么是坏的呢?它是将数字
1
打印到
10
,而不做任何其他事情吗?还是只
1
然后停止?还有,
std::vector
有什么问题吗?或者这里的目的是写
Stack
,这只是一个例子st case?Stack.pop()的返回类型是什么?这可能就是问题所在。我不会在这里弄乱指针。通常pop应该返回一个值而不是引用。您能再描述一下它输出的内容吗?任何错误或它实际输出的内容都会有所帮助。另外,正如前面提到的,我们需要有关堆栈类如何工作的更多信息。@User216066 well-I copied您的代码和我得到10“1”,带行。我实际上得到了文件的最后10行,顺序相反(这对您来说是一个很好的练习-找出它,这很有意义)好的,所以
pop
返回一个空指针。可能您的
堆栈
实现被破坏。@BoBTFish实际上我认为程序没有找到“main.cpp”,因为它对我来说很好。我同意这个诊断…特别是如果你在Xcode中使用build/run命令。尝试使用绝对路径,看看是否能得到更好的结果。感谢你的回复。我现在知道最后10行应该是答案的倒序。但我无法得到结果。我还尝试用“TStack.h”替换“main.cpp”,不起作用。我拖入了一个.txt文件,也不起作用。你知道为什么会发生这种情况吗?
#ifndef stackex_TStack_h
#define stackex_TStack_h

template <class T>
class Stack {
    struct Link{
        T* data;
        Link* next;
        Link(T* dat, Link* nxt): data(dat), next(nxt) {}
    }* head;

public:
    Stack() : head(0) {}
    ~Stack() {
        while(head)
            delete pop();
    }
    void push(T* dat) {
        head = new Link(dat, head);
    }

    T* peek() const {
        return head ? head->data : 0;
    }
    T* pop() {
        if(head == 0) return 0;
        T* result = head->data;
        Link* oldHead = head;
        head = head->next;
        delete oldHead;
        return result;
    }
};