ফাইলগুলিতে সিন এবং কাউটকে কীভাবে পুনর্নির্দেশ করবেন?


133

আমি কিভাবে পুনর্নির্দেশ করতে পারেন cinকরতে in.txtএবং coutকরতে out.txt?


8
একটি স্ট্রিং পুনর্চালনা Cin: stackoverflow.com/questions/4925150/redirect-cin-to-a-string - পুনর্চালনা cout একটি স্ট্রিং হবে: stackoverflow.com/questions/1162068/...
Dr.Kameleon

উত্তর:


219

আপনি যা করতে চান তার একটি কার্যকারী উদাহরণ এখানে। কোডের প্রতিটি লাইন কী করে তা জানতে মন্তব্যগুলি পড়ুন। আমি এটি আমার পিসিতে জিসিসি 4.6.1 দিয়ে পরীক্ষা করেছি; এটা ঠিক কাজ করে।

#include <iostream>
#include <fstream>
#include <string>

void f()
{
    std::string line;
    while(std::getline(std::cin, line))  //input from the file in.txt
    {
        std::cout << line << "\n";   //output to the file out.txt
    }
}
int main()
{
    std::ifstream in("in.txt");
    std::streambuf *cinbuf = std::cin.rdbuf(); //save old buf
    std::cin.rdbuf(in.rdbuf()); //redirect std::cin to in.txt!

    std::ofstream out("out.txt");
    std::streambuf *coutbuf = std::cout.rdbuf(); //save old buf
    std::cout.rdbuf(out.rdbuf()); //redirect std::cout to out.txt!

    std::string word;
    std::cin >> word;           //input from the file in.txt
    std::cout << word << "  ";  //output to the file out.txt

    f(); //call function


    std::cin.rdbuf(cinbuf);   //reset to standard input again
    std::cout.rdbuf(coutbuf); //reset to standard output again

    std::cin >> word;   //input from the standard input
    std::cout << word;  //output to the standard input
}

আপনি কেবল একটি লাইনে সংরক্ষণ এবং পুনঃনির্দেশ করতে পারেন:

auto cinbuf = std::cin.rdbuf(in.rdbuf()); //save and redirect

এখানে বাফার std::cin.rdbuf(in.rdbuf())সেট std::cin'sকরে in.rdbuf()এবং তার সাথে যুক্ত পুরানো বাফারটি ফিরিয়ে দেয় std::cin। খুব একই জিনিসটি করা যেতে পারে std::cout- বা for বিষয়টির জন্য কোনও স্ট্রিম

আশা করি এইটি কাজ করবে.


4
আমি সিএন পুনরায় সেট করার আগে এবং স্ট্যান্ডার্ড আইওতে কাউট করা দরকার কি?
আপডেটগলিউ

3
@updogliu: নং আপনি যদি চান, আপনি ব্যবহার করতে পারেন inএবং outথেকে ও লিখতে পড়তে, in.txtএবং out.txtযথাক্রমে। এছাড়াও, ফাইল স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে inএবং outপরিধি বাইরে যেতে।
নওয়াজ

আমি এই সমাধানটি সর্বোপরি পছন্দ করি freopenকারণ আমি stdoutযদি ব্যবহার করি তবে আর ফিরে আসতে পারব না freopenstackoverflow.com/questions/26699524/...
xxks-kkk

88

শুধু লেখো

#include <cstdio>
#include <iostream>
using namespace std;

int main()
{
    freopen("output.txt","w",stdout);
    cout<<"write in file";
    return 0;
}

14
এটি পুনর্নির্দেশ stdout, না cout
আপডেটোগ্লিউ

5
এটি প্রিন্টফকেও পুনঃনির্দেশিত করবে, যা কিছু ক্ষেত্রে ভাল জিনিস হতে পারে।
জেডিম্যাটটিও

5
@ অক্ষয়লারাধ্যায় আপনি সেট করার সময় নয় std::sync_with_studio(false);, যদিও ডিফল্টরূপে এটি সেট করা আছে true
ভার্সোফ্টকো

2
@ PřemyslŠťastný কেন?
রেগেগুইটার

4
উত্তরগুলি কার্যকারণে সমান হলে, এর সি ++ সমতুল্য হবে ofstream out("out.txt"); cout.rdbuf(out.rdbuf());- কেবল একটি অতিরিক্ত লাইন, এবং এটি বহনযোগ্য। খুব বেশি সহজ নয় :)
নেভেলিস

19

প্রোগ্রামিং প্রতিযোগিতার জন্য সিড / সিউড ছায়ার জন্য এখানে একটি ছোট কোড স্নিপেট রয়েছে:

#include <bits/stdc++.h>

using namespace std;

int main() {
    ifstream cin("input.txt");
    ofstream cout("output.txt");

    int a, b;   
    cin >> a >> b;
    cout << a + b << endl;
}

এটি অতিরিক্ত সুবিধা দেয় যে সমতল স্ট্রিম স্ট্রিমগুলি সিঙ্ক করা স্টডিও স্ট্রিমগুলির চেয়ে দ্রুত। তবে এটি কেবল একক ফাংশনের সুযোগের জন্য কাজ করে।

গ্লোবাল সিন / cout পুনর্নির্দেশ হিসাবে লেখা যেতে পারে:

#include <bits/stdc++.h>

using namespace std;

void func() {
    int a, b;
    std::cin >> a >> b;
    std::cout << a + b << endl;
}

int main() {
    ifstream cin("input.txt");
    ofstream cout("output.txt");

    // optional performance optimizations    
    ios_base::sync_with_stdio(false);
    std::cin.tie(0);

    std::cin.rdbuf(cin.rdbuf());
    std::cout.rdbuf(cout.rdbuf());

    func();
}

লক্ষ্য করুন ios_base::sync_with_stdioএছাড়াও রিসেট std::cin.rdbuf। সুতরাং আদেশ গুরুত্বপূর্ণ।

Ios_base এর তাত্পর্যটিও দেখুন: সিঙ্ক_ইথ_স্টডিও (মিথ্যা); cin.tie (নাল);

স্ট্যান্ডার্ড আইও স্ট্রিমগুলি সহজেই একক ফাইলের সুযোগের জন্য ছায়া গোছানো যায়, যা প্রতিযোগিতামূলক প্রোগ্রামিংয়ের জন্য দরকারী:

#include <bits/stdc++.h>

using std::endl;

std::ifstream cin("input.txt");
std::ofstream cout("output.txt");

int a, b;

void read() {
    cin >> a >> b;
}

void write() {
    cout << a + b << endl;
}

int main() {
    read();
    write();
}

তবে stdএক্ষেত্রে আমাদের একের পর এক ঘোষণাপত্র বাছাই করতে হবে এবং এড়িয়ে যাওয়ার using namespace std;কারণ এটি অস্পষ্টতার ত্রুটি দেয়:

error: reference to 'cin' is ambiguous
     cin >> a >> b;
     ^
note: candidates are: 
std::ifstream cin
    ifstream cin("input.txt");
             ^
    In file test.cpp
std::istream std::cin
    extern istream cin;  /// Linked to standard input
                   ^

আরও দেখুন কীভাবে আপনি সি ++ তে নেমস্পেসগুলি সঠিকভাবে ব্যবহার করবেন? , "নেমস্পেস স্টাডি ব্যবহার" খারাপ অভ্যাস হিসাবে বিবেচিত হয় কেন? এবং একটি সি ++ নামস্থান এবং একটি বৈশ্বিক ফাংশনের মধ্যে নামের সংঘর্ষকে কীভাবে সমাধান করবেন?


15

আপনার কম্পাইলগুলি প্রগের নাম ধরে নেওয়া x.exe এবং the সিস্টেম শেল বা প্রম্পট

$ x <infile >outfile 

ইনফিল থেকে ইনপুট নেবে এবং আউটপুট আউটপুট হবে।


এটি সি ++ সম্পর্কিত নয় এবং কোনও অ-তুচ্ছ উদাহরণে ব্যর্থ হয়, উদাহরণস্বরূপ যখন যখন আপনার প্রোগ্রামটি শিশুদের প্রক্রিয়াগুলি কনসোলটিতে লেখার প্রসারণ করে। আমি এই জাতীয় পুনঃনির্দেশের চেষ্টা করার সময় আমি যে সমস্যার মুখোমুখি হয়েছিলাম, সে কারণেই কেন আমি এখানে আছি।
আশ্রসমুন

5

Cout ফাইল থেকে পুনর্নির্দেশের জন্য এটি চেষ্টা করুন Try

#include <iostream>
#include <fstream>

int main()
{
    /** backup cout buffer and redirect to out.txt **/
    std::ofstream out("out.txt");

    auto *coutbuf = std::cout.rdbuf();
    std::cout.rdbuf(out.rdbuf());

    std::cout << "This will be redirected to file out.txt" << std::endl;

    /** reset cout buffer **/
    std::cout.rdbuf(coutbuf);

    std::cout << "This will be printed on console" << std::endl;

    return 0;
}

পুরো নিবন্ধটি পড়ুন স্টিন :: আরডিবিফ ব্যবহার করুন সিন এবং কাউট পুনর্নির্দেশের জন্য


1
এই প্রশ্নের উত্তর প্রায় years বছর পূর্বে (২০১২ সালে) দেওয়া হয়েছিল, তবুও আপনি এখন 2018 সালে একটি উত্তর যুক্ত করেছেন Your আপনার উত্তর গৃহীত উত্তর হিসাবে একই। সুতরাং আমি ভাবছি যখন আপনার কাছে নতুন কিছু যুক্ত করার দরকার নেই তখন আপনি কেন এটি পোস্ট করলেন ?
নওয়াজ

আমার উত্তরটি কেবল বিশেষভাবে কার্ট সংস্করণকে হাইলাইট করে এবং বিস্তারিত উত্তর নীচের লিঙ্কে সরবরাহ করা হয়েছে।
HaseeB মীর

আপনার উত্তরে নতুন কী যা গ্রহণযোগ্য উত্তরে উপস্থিত নেই ?
নওয়াজ

2
আমার উত্তরটি
চতুর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.