2013-08-06 39 views
11

Để nhập nhanh hơn, tôi đọc rằng bạn có thể thực hiện file-redirection và bao gồm một tệp có đầu vào cin đã được đặt.Chuyển hướng tập tin C++

Nó lý thuyết nó nên được sử dụng như sau

App.exe inputfile outputfile 

Theo như tôi hiểu trong cuốn sách C++ Primer, The C sau ++ mã [1] nên đọc cin đầu vào từ tập tin văn bản và không nên cần bất kỳ dấu hiệu đặc biệt khác như [2]

[2]

include <fstream> 
ofstream myfile; 
myfile.open(); 

[1] sau đây C++ ...

01.
#include <iostream> 
int main(){ 
    int val; 
    std::cin >> val; //this value should be read automatically for inputfile 
    std::cout << val; 
    return 0; 
} 

Tôi có thiếu gì đó không?

+0

Có - đó không phải là cách nó phải được đã sử dụng. –

Trả lời

17

Để sử dụng mã của bạn [1] bạn phải gọi chương trình của bạn như thế này:

App.exe <inputfile> outputfile 

Bạn cũng có thể sử dụng:

App.exe <inputfile>> outputfile 

Trong trường hợp này đầu ra sẽ không được rewrited với mọi lần chạy lệnh, nhưng đầu ra sẽ được thêm vào tệp hiện có.

Thông tin thêm về chuyển hướng đầu vào và đầu ra trong Windows, bạn có thể tìm thấy here.


Lưu ý rằng <, >>> những biểu tượng là để được nhập đúng nguyên văn — họ không chỉ dành riêng cho mục đích trình bày trong lời giải thích này. Vì vậy, ví dụ:

App.exe <file1>> file2 
+5

Bạn cũng có thể sử dụng 'App.exe < inputfile >> outputfile'. Thông báo thêm '>'. Bằng cách này, đầu ra mới sẽ được thêm vào tệp thay vì xóa nội dung trước đó của nó. – Kelm

+1

Cảm ơn @gawi, tôi nghĩ rằng < and > đã được sử dụng để chỉ một biến hoặc một cái gì đó. – zurfyx

+0

@Jerry Xin chào, btw nếu bạn muốn tăng tốc chương trình, bạn có thể sử dụng chức năng printf/scanf, hoặc nếu bạn thực sự muốn tăng tốc độ đọc/ghi dữ liệu, hãy sử dụng chức năng fgets/puts (nhưng để làm điều này bạn phải biết những gì bạn đang làm :)) – gawi

5

Ngoài chuyển hướng gốc >/>><

Bạn có thể chuyển hướng std::cinstd::cout quá.

Giống như sau:

int main() 
{ 
    // Save original std::cin, std::cout 
    std::streambuf *coutbuf = std::cout.rdbuf(); 
    std::streambuf *cinbuf = std::cin.rdbuf(); 

    std::ofstream out("outfile.txt"); 
    std::ifstream in("infile.txt"); 

    //Read from infile.txt using std::cin 
    std::cin.rdbuf(in.rdbuf()); 

    //Write to outfile.txt through std::cout 
    std::cout.rdbuf(out.rdbuf()); 

    std::string test; 
    std::cin >> test;   //from infile.txt 
    std::cout << test << " "; //to outfile.txt 

    //Restore back. 
    std::cin.rdbuf(cinbuf); 
    std::cout.rdbuf(coutbuf); 

} 
0

[Tôi chỉ giải thích các đối số dòng lệnh được sử dụng trong Câu hỏi]

Bạn có thể cung cấp tên tập tin như dòng lệnh đầu vào cho executible, nhưng sau đó bạn cần phải mở chúng trong mã của bạn.

Giống như

Bạn đã cung cấp hai đối số dòng lệnh cụ thể là inputfile & outputfile

[App.exe inputfile outputfile]

Bây giờ trong mã của bạn

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

int main(int argc, char * argv[]) 
{ 
    //argv[0] := A.exe 
    //argv[1] := inputFile 
    //argv[2] := outputFile 

    std::ifstream vInFile(argv[1],std::ios::in); 
    // notice I have given first command line argument as file name 

    std::ofstream vOutFile(argv[2],std::ios::out | std::ios::app); 
    // notice I have given second command line argument as file name 

    if (vInFile.is_open()) 
    { 
    std::string line; 

    getline (vInFile,line); //Fixing it as per the comment made by MSalters 

    while (vInFile.good()) 
    { 
     vOutFile << line << std::endl; 
     getline (vInFile,line);   
    } 
    vInFile.close(); 
    vOutFile.close(); 
    } 

    else std::cout << "Unable to open file"; 

    return 0; 
} 
+0

Mã này thêm một dòng cuối cùng giả mạo. Khi lần đọc cuối cùng thất bại, bạn _first_ ghi 'dòng' thành' vOutFile' và chỉ sau đó kiểm tra 'vInFile.good()'. Thứ tự đúng trong vòng lặp phải là: 'đọc dòng, kiểm tra nếu đọc thành công, viết dòng, goto đọc' – MSalters

+0

Vâng Cảm ơn bạn đã chỉ ra. tôi sẽ sửa nó –

Các vấn đề liên quan