2014-09-23 59 views
0

以下代碼是較大的翻譯程序的一部分。下面的代碼要求用戶輸入一行,而不是隻寫回來。有沒有一種方法,而不是每次寫一行,我可以在標準輸入中傳遞整個文件等'translate.txt',程序可以逐行寫回,並在行結束時產生錯誤到達了 ?將文本文件傳遞到標準輸入

#include <iostream> 
#include <string.h> 
#include<stdio.h> 
#include<fstream> 
using namespace std; 


using namespace std; 


void PL() { 

    char line[BUFSIZ]; 

    while(cin.good()) { 
     cout<<"Type line now"<<endl; 
     cout<<"\n"; 
     cin.getline(line, sizeof(line)); 
     cout<<"\n"<<endl; 
     string mystring = string(line); 

     // supposed to Parsing string into words and translate// 
     //but just reading back input for now// 

     cout<<"You typed:"<<mystring<<endl; 
     cout<<"\n"<<endl; 
    } 

} 

int main() { 
    PL(); 
} 
+0

是但它是外部的C++。這取決於程序運行的shell。在Linux BASH中,您可以管理數據和cat文件。所以如果我想發送'myfile.txt'到'myprog'的標準輸入,我會像這樣運行它:'cat myfile.txt | myprog'。注意管道符號是'|',它將管道傳輸到標準輸入。 – Galik 2014-09-23 01:51:21

+0

是的,我應該在SSH shell上運行這個程序,通過編寫:./cat 寫入./cat example.txt不起作用,即使example.txt與安全shell中的prog位於相同的目錄中。 – slk 2014-09-23 01:59:37

回答

1

您是否期待一種將文件傳遞到程序的方式?

executable < file 
+0

是的,但不知道怎麼做 – slk 2014-09-23 01:54:18

+0

得到它,如果你是在SSH安全的shell中運行這個,你需要做一個可執行文件,並鍵入: ./runthis slk 2014-09-23 04:11:04

+0

@slk請注意,有幾種方法可以爲您的程序提供輸入文件。最靈活的選擇是直接使用傳遞給程序的命令行參數。 – 2014-09-23 04:36:40

0

你的shell將有一種方法可以通過stdin傳遞一個文件。因此,舉例來說,如果你是一個兼容Bourne外殼可以運行

translate < translate.txt 

(假設你的程序被編譯成一個名爲translate二進制)。假設您想要以交互方式啓動程序,即從shell中啓動程序。

如果你想從你編寫的另一個程序自動產生這個程序,這取決於你的操作系統。例如,在POSIX操作系統上,分叉之後但在調用exec系列函數之一之前,您需要open文件和dup2生成的文件描述符到STDIN_FILENO

+0

謝謝,我不知道你可以將你的文本文件發送到shell中的可執行文件中。 – slk 2014-09-23 03:39:53

0

This code works well for me

void PL() { 
    string line; 

    while(cin) { 
     cout<<"Type line now"; 
     if(std::getline(cin,line)) { 
      // supposed to Parsing string into words and translate// 
      //but just reading back input for now// 
      cout<<"You typed:"<<line<<endl; 
     } 
    } 
} 

注意,stdin有實際傳遞從shell程序提到:

$ executable < file 

如果你想通過任意類型創建流從外部功能,你需要像

void PL(std::istream& is) { 
    string line; 

    while(is) { 
     cout<<"Type line now"; 
     if(std::getline(is,line)) { 
      // supposed to Parsing string into words and translate// 
      //but just reading back input for now// 
      cout<<"You typed:"<<line<<endl; 
     } 
    } 
} 

int main() { 
    std::ifstream is("mytext.txt"); // hardcoded filename 
    PL(is); 
    return 0; 
} 

或替代地

int main(int argc, char* argv[]) { 

    std::istream* input = &std::cin; // input is stdin by default 
    if(argc > 1) { 
     // A file name was give as argument, 
     // choose the file to read from 
     input = new std::ifstream(argv[1]); 
    } 

    PL(*input); 

    if(argc > 1) { 
     // Clean up the allocated input instance 
     delete input; 
    } 
    return 0; 
} 

當然,還有更優雅的解決方案

和命令行調用:

$ executable mytext.txt 
+0

我看你讓它更直接,謝謝! 現在我該怎樣傳遞一個文本文件中,而不是SSH的安全殼 – slk 2014-09-23 02:02:23

+0

@slk你檢查在線樣本連接,我使用的投入? – 2014-09-23 02:04:55

+0

@slk你的意思是將'std :: istream&'參數傳遞給這個函數,而不是從'std :: cin'中讀取數據,而是從該函數的外部使用'std :: ifstream'打開一個文本文件? – 2014-09-23 02:08:38

相關問題