El uso de la función freopen en la competencia acm

En el proceso de resolver los problemas de acm, necesitamos depurar en la máquina local. Durante el proceso de depuración, si los datos de entrada son pequeños, es aceptable, pero si los datos de entrada son muy grandes, es difícil para nosotros tolerar volver a ingresar y depurar una y otra vez. A través de google, encontré una forma fácil, es decir, la función freopen.
       El uso de la función de apertura automática puede resolver el problema de entrada de datos de prueba y evitar la entrada repetida, que es una solución simple y eficaz. 
    La siguiente es una breve introducción de la función. Para obtener más detalles, consulte http://www.cplusplus.com/reference/clibrary/cstdio/freopen.html
    Nombre de la función:
    declaración de freopen  : FILE * freopen (const char * path, const char * mode, FILE * stream); 
    Archivo: stdio.h 
    Descripción del parámetro: 
               ruta: nombre de archivo, utilizado para almacenar nombres de archivo personalizados para entrada y salida. 
               modo: el modo de apertura del archivo. Igual que el modo en fopen (como r-read only, w-write). 
               flujo: un archivo, generalmente un archivo de flujo estándar. 
    Valor de retorno: si tiene éxito, devuelve un puntero al archivo especificado por la ruta; si falla, devuelve NULL. (Generalmente, no es necesario usar su valor de retorno) 
    Función: Realizar redireccionamiento, Dirija el archivo continuo estándar predefinido al archivo especificado por la ruta. Los archivos de flujo estándar se refieren específicamente a stdin, stdout y stderr. Entre ellos, stdin es el flujo de entrada estándar, el predeterminado es el teclado; stdout es el flujo de salida estándar, el predeterminado es la pantalla; stderr es el flujo de error estándar, generalmente establece la pantalla como el predeterminado. Al llamar a freopen, puede modificar el valor predeterminado del archivo de flujo estándar para lograr la redirección.

Hay los siguientes ejemplos para verificar en vs2005:

 

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

int main() 

    int a,b; 
    freopen("in.txt","r",stdin); //输入重定向,输入数据将从in.txt文件中读取
    freopen("out.txt","w",stdout); //输出重定向,输出数据将保存在out.txt文件中
    while(cin>> a >> b) 
        cout<< a+b <<endl; // 注意使用endl
    fclose(stdin);//关闭文件
    fclose(stdout);//关闭文件
    return 0; 
}

 

       La función de freopen ("in.txt", "r", stdin) es redirigir el flujo de entrada estándar stdin al archivo in.txt, para que no lea del flujo de entrada estándar cuando se usa scanf o cin. Datos, pero obtenga la entrada del archivo in.txt. Simplemente pegue los datos de entrada en in.txt de antemano, es mucho más conveniente al depurar. 
De manera similar, la función de freopen ("out.txt", "w", stdout) es redirigir stdout al archivo out.txt, de modo que el resultado de salida debe abrirse para ver el archivo out.txt. 

    Cabe señalar que: 
        1. Al llamar a la función freopen para implementar la redirección, el nombre de la ruta debe escribirse correctamente. 
        2. Puede utilizar la entrada del teclado sin redirección de entrada, o puede ver la salida en la consola sin utilizar la redirección de salida. Todo esto es posible, según sus necesidades.
        3. Este método es adecuado para depurar en la máquina local. Después de que el programa se depure con éxito, no olvide eliminar las declaraciones relacionadas con la redirección cuando envíe a oj. De hecho, este problema todavía se considera en el sistema OJ de algunas escuelas. Por ejemplo, el sistema OJ de Hangzhou Electric tiene este problema en las preguntas frecuentes:

P: ¿Hay alguna forma de determinar si mi programa se ejecuta en Online Judge o no?

R: Hay una definición condicional del compilador llamado ONLINE_JUDGE. Ejemplo de uso:

C / C ++

#ifdef ONLINE_JUDGE

corriendo en juez en línea

#más

    puedes hacer algo aquí en tu computadora local

#terminara si

Por ejemplo, puedo enviar las 1000 preguntas de Hangdian de la siguiente manera:

 

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

using namespace std;
int main() 

#ifdef ONLINE_JUDGE
#else
    freopen("in.txt","r",stdin);
#endif
    int a,b;
    while(cin>>a>>b)
        cout<<a+b<<endl;
    return 0;
}

 

 

 

Al depurar en la máquina local, debido a que ONLINE_JUDGE no se ha definido, se ejecutará freopen ("in.txt", "r", stdin); es conveniente para depurar en la máquina local. Cuando se envía a OJ, tiene la definición de ONLINE_JUDGE , Omita la instrucción freopen ("in.txt", "r", stdin); ejecute desde int a, b ;. Después de la prueba, AC.

Supongo que te gusta

Origin blog.csdn.net/hbhhhxs/article/details/90759327
Recomendado
Clasificación