ฉันcin
จะเปลี่ยนเส้นทางไปin.txt
และcout
กลับได้out.txt
อย่างไร
ฉันcin
จะเปลี่ยนเส้นทางไปin.txt
และcout
กลับได้out.txt
อย่างไร
คำตอบ:
นี่คือตัวอย่างการทำงานของสิ่งที่คุณต้องการทำ อ่านความคิดเห็นเพื่อทราบว่าแต่ละบรรทัดในโค้ดทำหน้าที่อะไร ฉันได้ทดสอบบนพีซีของฉันด้วย gcc 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
buffer ไปแล้วกลับบัฟเฟอร์เก่าที่เกี่ยวข้องกับin.rdbuf()
std::cin
เช่นเดียวกันสามารถทำได้ด้วยstd::cout
- หรือสตรีมใด ๆสำหรับเรื่องนั้น
หวังว่าจะช่วยได้
in
และout
เพื่ออ่านและเขียนถึงin.txt
และout.txt
ตามลำดับ นอกจากนี้ไฟล์จะถูกปิดโดยอัตโนมัติเมื่อin
และout
ออกนอกขอบเขต
freopen
หนึ่งเพราะผมไม่สามารถรับฉันกลับถ้าผมใช้stdout
stackoverflow.com/questions/26699524/…freopen
แค่เขียน
#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
freopen("output.txt","w",stdout);
cout<<"write in file";
return 0;
}
stdout
cout
std::sync_with_studio(false);
แม้ว่าโดยค่าเริ่มต้นจะตั้งเป็นtrue
.
ofstream out("out.txt"); cout.rdbuf(out.rdbuf());
เพียงบรรทัดเดียวพิเศษและเป็นแบบพกพา ไม่ง่ายกว่านี้มาก :)
นี่คือตัวอย่างโค้ดสั้น ๆ สำหรับการทำเงา cin / cout ที่มีประโยชน์สำหรับการแข่งขันการเขียนโปรแกรม:
#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;
}
สิ่งนี้ให้ประโยชน์เพิ่มเติมที่ fstreams ธรรมดาเร็วกว่าสตรีม stdio ที่ซิงค์ แต่จะใช้ได้เฉพาะกับขอบเขตของฟังก์ชันเดียวเท่านั้น
การเปลี่ยนเส้นทาง cin / 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 :: sync_with_stdio (false); cin.tie (NULL);
สตรีม Std io สามารถกำหนดขอบเขตของไฟล์เดียวได้อย่างง่ายดายซึ่งมีประโยชน์สำหรับการเขียนโปรแกรมเชิงแข่งขัน:
#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
^
ดูเพิ่มเติมคุณใช้เนมสเปซใน C ++ อย่างไร? , เหตุใด "การใช้เนมสเปซ std" จึงถือว่าเป็นการปฏิบัติที่ไม่ดี และจะแก้ไขการชนกันของชื่อระหว่างเนมสเปซ C ++ และฟังก์ชันส่วนกลางได้อย่างไร
สมมติว่าชื่อ prog คอมไพล์ของคุณคือ x.exe และ $ คือเชลล์ของระบบหรือพร้อมต์
$ x <infile >outfile
จะรับอินพุตจาก infile และจะส่งออกไปยัง outfile
ลองใช้วิธีนี้ในการเปลี่ยนเส้นทางศาลไปยังแฟ้ม
#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;
}
อ่านบทความเต็มใช้ std :: rdbuf เพื่อเปลี่ยนเส้นทาง cin และ cout