2016-01-31 13 views
0

Я пытаюсь читать из стандартного ввода ([a.out < text.txt] в UNIX), и я использовал следующие два блока кода:Стандартный ввод в то время как цикл не будет выхода из C++

int main(){ 
    while (!cin.eof()){ReadFunction()} 
    OutputFunction();} 

и

int main(){ 
    char c; 
    while (cin.getchar(c)){ReadFunction()} 
    OutputFunction();} 

Оба эти петли выполняют функцию чтения правильно, но ни один из них выйти из цикла и выполнять функцию вывода. Как я могу читать символ по символу со стандартного ввода, а затем выполнять свою функцию вывода?

+0

Отправьте код для 'ReadFunction()'. –

ответ

0

Я думаю, это может быть проблемой в вашем ReadFunction(). Если вы не читаете символы, поток не продвинется и застрянет в цикле.
следующий код работает: -

#include <iostream> 
#include <string> 
using namespace std; 
string s; 

void ReadFunction() 
{ 
    char a; 
    cin >> a; 
    s = s + a; 
} 

void OutputFunction() 
{ 
    cout <<"Output : \n" << s; 
} 

int main() 
{ 
    while (!cin.eof()){ReadFunction();} 
    OutputFunction(); 
} 
0

cin.eof() известен как ненадежный. Если часто можно вернуть неточный результат. В любом случае рекомендуется скопировать все данные из файла (который, как вы сказали, является вашим стандартным вводом), а затем получить символы из этого. Я рекомендую использовать std :: stringstream для хранения данных в файле, затем используя std :: getline(). Я не сталкивался с программированием Unix, но вы можете вообще попробовать что-то вроде этого:

#include <string> 
#include <sstream> 
#include <iostream> 

int main() { 
    std::string strData; 
    std::stringstream ssData; 
    while (std::getline(in /*Your input stream*/, strData)) 
     ssData << strData; 

    ssData.str().c_str(); // Your c-style string 

    std::cout << (ssData.str())[0]; // Write first char 

    return 0; 
} 

А почему ваше время петли не выходя, вероятно, связано с implimentation, но вы можете рассматривать это как альтернативу.

0

Самый простой метод, который я могу вспомнить, используя что-то вроде следующего

#include <cstdio> 
int main() { 
    char c; 
    while((c = getchar()) != EOF) { // test if it is the end of the file 
     // do work 
    } 
    // do more work after the end of the file 
    return 0; 
} 

Единственное отличие от твоего существа, приведенный выше код проверяет c, чтобы увидеть если это конец файла. Тогда что-то вроде ./a.out < test.txt должно работать.

+0

Это значительно изменяет поведение кода OP, читая из 'stdin' как часть условия while. Один символ в то время также является самым медленным способом чтения данных. –

+0

Согласовано, но вопрос явно указывает «читать по характеру по характеру». Вышеупомянутое решение далеки от предлагаемого способа чтения ввода от 'stdin'. Просто пример чтения символа по символу и проверки «EOF». –

+0

В настоящее время решена проблема с 'while (! Cin.eof() {...}' и в ответ на вопрос о скорости я читаю символ по символу, потому что функция чтения подсчитывает количество применений каждого символа, а также каждый слово и число. Существует ли более быстрый способ чтения со стандартного ввода при отслеживании количества применений каждого символа? –