Как я могу сделать файл ввода / вывода без Fstream для соревнований, таких как Google Code Jam? - PullRequest
0 голосов
/ 18 мая 2011

Позвольте мне в начале этого вопроса сказать, что я не очень опытный программист.

Для соревнований, таких как google code jam, я пишу такой код:

#include <fstream>

using namespace std;

int main() {
    ifstream fin("file.in");
    ofstream oin("file.out");
    //Etc. I'll now write out my solution.
    //...
}

Однако я заметилчто многие другие исходные коды других участников вообще не используют fstream и вместо этого используют iostream.Тогда они будут использовать cout и cin, как если бы они читали и писали с консоли.

Как они это делают?Могу ли я сделать то же самое, если я использую g ++ и ubuntu?

РЕДАКТИРОВАТЬ: Поскольку меня попросили опубликовать пример того, что я имею в виду, вот код от участника рюуга, который решилlarge Bot Trust, задача A из последнего квалификационного раунда '11.

Он использует cin и cout, но я не знаю, как он делает файл ввода / вывода.

#include <iostream>
using namespace std;
#include <cstdio>
#include <algorithm>
#include <deque>
#include <map>
#include <set>
typedef pair<int,int> pii;
#include <vector>
typedef vector<int> vi;
#include <queue>
#include <stack>
#define For(i,a,b) for(int i=(a);i<(b);++i)

#define ForI(i,a,b) for(int i=(a);i<=(b);++i)
#define ForAll(it,set) for(typeof(set.begin()) it = set.begin(); it!=set.end(); ++it)

typedef stack<int> si;
typedef queue<int> qi;

int main(){
    int t;
    cin>>t;
    ForI(tt,1,t){
        int n;cin>>n;
        int pos[2]={1,1}, time[2] = {0,0};
        int curTime = 0;
        For(i,0,n){
            char type; int button;
            cin>>type>>button;
            type = (type=='B'?1:0);
            int nextTime = 1+max(curTime, time[type] + abs(button - pos[type]));
            pos[type] = button;
            time[type] = nextTime;
            curTime = nextTime;
        }
        cout<<"Case #"<<tt<<": "<<curTime<<endl;
    }

    return 0;
}

1 Ответ

4 голосов
/ 18 мая 2011

Представьте, когда вы используете оболочку в Ubuntu.Почти все читается консолью, cin и записывается в консоль cout.Например,

cat "file.txt" | grep "Hello"

cat получит файл "file.txt" из аргументов, переданных main, то есть

main(int argc, char ** argv){
    // for the both cat and grep examples argc is 2
    // argv[1] contains "file.txt" for cat. 
    // open an ifstream and ouput it to cout. There's cat for you.
}

Чтобы узнать, что содержит argv[0], попробуйте!grep прочитал бы тот же аргумент, затем прочитал бы все из cin, скопировал бы ввод, соответствующий argv[1], в cout

РЕДАКТИРОВАТЬ: Он запускает свою программу с

cat "downloaded-input-file.txt" | theprogram > output.txt

Затем отправляетпрограмма.Или он может использовать синтаксис < downloaded-input-file.Я сохраняю первоначальное объяснение, так как оно может быть полезно для понимания процесса.

...