c++ - 运行时错误 : Illegal file open (/dev/tty)

标签 c++ memory-management runtime

我最近注册了 USACO 在线培训计划,目前正在学习第 2 题。 我已经完成了它的编码并且一切都正确编译了。但是当我提交代码时,我不断收到以下错误:

运行 1:执行错误:您的程序出现此运行时错误: 非法文件打开 (/dev/tty)。该程序运行了 0.011 个 CPU 错误前几秒。它使用了 3348 KB 的内存。

我试过查找问题,但没有成功。但是,我认为这是一个内存管理问题,因为我使用了指针 vector 。在 USACO 常见问题解答中,他们说:

运行我们评分系统的 Linux 在内存访问方面比 Windows 更挑剔。因此,在 Windows 上允许的无效数组索引和坏指针解引用可能会导致您的程序在 Linux 下崩溃。或者,它们会破坏内部数据结构并给出最神秘的错误消息,例如“无法打开/dev/[mumble]”。

代码如下:

/*
ID: freebie1
PROG: gift1
LANG: C++
*/
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <fstream>
using namespace std;


class Person {
    public:
    Person():m_volatile(0) {}

    void setName(string name) { m_name = name; }
    string getName() { return m_name; }
    void setMoney(int money){ m_sMoney = money; }
    int getMoney() { return m_volatile; }
    void receive(int money) { m_volatile += money; }
    void giveGifts(vector<Person*> fTab){
        int splitMoney = m_sMoney/fTab.size();
        for(vector<Person*>::iterator it=fTab.begin();it!=fTab.end();it++) {
            (*it)->receive(splitMoney);
        }
        m_volatile-=splitMoney*fTab.size();
    }

    private:
    string m_name;
    int m_sMoney; // starting money
    int m_volatile;
};

.

class FindFriend {
    public:
    FindFriend(string query):m_query(query){}
    bool operator()(Person &individu){
        if(individu.getName()==m_query) { return true; }
        else { return false; }
    }
    private:
    string m_query;
};

vector<Person*> setFriends(vector<string> &namesTab,vector<Person> &personsTab){
    vector<Person*> tab;
    for(vector<string>::iterator it=namesTab.begin();it!=namesTab.end();it++) {
        FindFriend f(*it);
        vector<Person>::iterator trouve=find_if(personsTab.begin(),personsTab.end(),f);
        tab.push_back(&*trouve);
    }
    return tab;
}

int main() {
    ofstream fout("gift1.out");
    ifstream fin("gift1.in");

    if(fin) {
        int np(0);
        fin>>np; // Number of persons

        // Each one is assigned a name...
        vector<Person> personsTab(np);
        for(vector<Person>::iterator it=personsTab.begin();it!=personsTab.end();it++){
            string namePerson;
            fin>>namePerson;
            it->setName(namePerson);
        }
        // ...money and the friends we'll give the money to
        while(!fin.eof()){
            string name;
            int money(0),nFriends(0);
            fin>>name;
            FindFriend g(name);
            vector<Person>::iterator trouve=find_if(personsTab.begin(),personsTab.end(),g);
            fin>>money>>nFriends;
            trouve->setMoney(money); // Somme de depart
            // Amis
            if(nFriends!=0 || money!=0) {
                vector<string> friendsTab;
                for(int i(0);i<nFriends;i++) {
                    string chaine;
                    fin>>chaine;
                    friendsTab.push_back(chaine);
                }
                // We create a vector of pointers to his friends
                vector<Person*> pFriends(nFriends);
                pFriends=setFriends(friendsTab,personsTab);
                trouve->giveGifts(pFriends); // Each person share the money among his friends
            }
        }

        // We output the net loss/profit for each one
        for(vector<Person>::iterator it=personsTab.begin();it!=personsTab.end();it++) {
            string name=it->getName();
            int money=it->getMoney();
            fout<<name<<" "<<money<<endl;
        }
    }
    return 0;
}

这里是输入文件 gift1.in

5
dave
laura
owen
vick
amr
dave
200 3
laura
owen
vick
owen
500 1
dave
amr
150 2
vick
owen
laura
0 2
amr
vick
vick
0 0

最佳答案

问题是您没有正确测试文件结尾。使用 fin.eof() 是错误的,因为 eof() 只有在您尝试读取失败后才会变为真,它不会预测是否下一次读取将失败。令人难以置信的是,有多少初学者会犯这个错误。

这里有一个更好的方法来做到这一点

   string name;
   while(fin >> name){
        int money(0),nFriends(0);
        ...
   }

错误的结果是你多绕了一次 while 循环。在循环的最后一次,name 不包含有效值,您对 find_if 的调用失败,程序很快崩溃。

关于c++ - 运行时错误 : Illegal file open (/dev/tty),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11708320/

相关文章:

c - 尝试为 hermite 多项式暴力求根

c++ - 是否可以编写一个函数,它接受具有不同初始化的模板参数

java - 如何在运行时从外部 jar 访问方法(第 2 部分)?

c++ - 未使用的模板方法中的错误

c++ - 如何在 C++ 中选择堆分配与堆栈分配?

Objective-C - 使用 (NSNumber floatValue) 编程接收信号 : “EXC_BAD_ACCESS” .

ios - 在 iOS 应用程序的生命周期中何时触发 ARC?

python - 提高加权移动平均过滤函数的运行时间?

android - 链接器命令在 Android Studio 中失败并退出代码 1?

c++ - 排序并显示自定义 QVariant 类型