при использовании freopen () в Visual Studio C ++ система («пауза») не работает

Я пытался прочитать из файла в VS17. Но здесь система («пауза») не работает. Окно консоли здесь просто всплывает и исчезает. Файл input.txt содержит только одно целое число.

#include<iostream>
#include<stdio.h>
#include<cstdio>
#pragma warning(disable:4996)
using namespace std;
int main()
{
freopen("input.txt", "r", stdin);
int n;
cin >> n;
cout << n << endl;
system("pause");
return 0;
}

Так есть ли способ прочитать из файла и показать вывод в консоли, пока не будет дан другой ввод с клавиатуры. заранее спасибо

3

Решение

Вы либо не связывайтесь с stdin использовать system("pause") или восстановить его после использования.

#include<iostream>
#include<stdio.h>
#include<cstdio>
#include <fstream> // Include this
#pragma warning(disable:4996)
using namespace std;
int main()
{
std::ifstream fin("input.txt");  // Open like this
int n;
fin >> n;  // cin -> fin
cout << n << endl;
system("pause");
return 0;
}

Использование отдельного потока для чтения файла сохраняет изолированное чтение консоли.

#include <io.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>

using std::cin;
using std::cout;

int main( void )
{
int old;
FILE *DataFile;

old = _dup( 0 );   // "old" now refers to "stdin"// Note:  file descriptor 0 == "stdin"if( old == -1 )
{
perror( "_dup( 1 ) failure" );
exit( 1 );
}

if( fopen_s( &DataFile, "input.txt", "r" ) != 0 )
{
puts( "Can't open file 'data'\n" );
exit( 1 );
}

// stdin now refers to file "data"if( -1 == _dup2( _fileno( DataFile ), 0 ) )
{
perror( "Can't _dup2 stdin" );
exit( 1 );
}
int n;
cin >> n;
cout << n << std::endl;

_flushall();
fclose( DataFile );

// Restore original stdin
_dup2( old, 0 );
_flushall();
system( "pause" );
}

Здесь вы восстанавливаете оригинал stdin так что консольный ввод может использоваться system("pause"), Разбивая это на 2 отдельные функции override_stdin а также restore_stdin может быть более управляемым.

Вы можете (опционально скомпилировать свою тестовую программу на консоли, используя cl Средство компиляции командной строки, предоставляемое MSVC, и) запускают программу из командной строки, чтобы не пропустить вывод при выходе из программы. Либо вы можете найти некоторые параметры IDE, которые сохраняют консоль для мониторинга вывода, либо вы можете поставить точку останова в последней строке. (Может быть return 0) которые могут иметь свои собственные последствия / проблемы.

5

Другие решения

Информация о system("pause");

Что касается system("Pause") и его использование: я бы не рекомендовал использовать его в любой кодовой базе, предназначенной для переноса или распространения, и вот почему: Почему это неправильно!.

Теперь, если вы используете его для своего собственного быстрого грязного взлома, чтобы держать консоль Windows открытой только для тестирования небольших функций или классов, это хорошо, однако вот альтернатива, которая будет делать то же самое, что соответствует стандарту, а также быть переносимой.

#include <iostream>
#include <string>

int main() {
[code...]

std::cout << "\nPress any key to quit.\n";
std::cin.get(); // better than declaring a char.
return 0;
}

Информация о freopen()

Еще одна вещь, о которой нужно знать, это то, что вы звоните freopen() для текстового файла, но у вас никогда не было вызова закрыть файл после того, как вы сделали с ним; Я не знаю, если freopen() делает это автоматически, но если этого не произойдет, вы должны закрыть дескриптор файла перед выходом из программы и после извлечения из нее всей необходимой информации.

Вот связанный Q / A stack: freopen().

Для получения дополнительной информации о freopen() Вот отличная веб-страница ресурса: C: <cstdio> - freopen() & C++: <cstdio> - std::freopen()


Моя попытка запуска вашего кода.

Теперь, когда я смог протестировать вашу программу. Если вы используете Visual Studio и запускаете приложение из своего отладчика в режиме отладки, оно автоматически закроет приложение, когда это будет сделано. Вы можете запустить его без отладчика ( ctrl + F5 ) или запустите его из консоли или терминала за пределами IDE по пути сгенерированного исполняемого файла, и программа будет работать так, как вы ожидаете.

-1

По вопросам рекламы [email protected]