es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Salida adicional al escribir en un archivo usando std::cout

Estoy intentando leer datos de un archivo in.txt, y después de realizar algunos cálculos, estoy escribiendo la salida en out.txt.

¿Por qué hay un 7 extra al final de out.txt?

Contenido de la clase Solution.

“`c++
class Solution
{
public:
int findComplement(int num)
{
int powerof2 = 2, temp = num;

<pre><code> /*
obtener el número de bits correspondiente al número, y
encontrar la potencia de 2 más pequeña mayor que el número.
*/
while (temp >> 1)
{
temp >>= 1;
powerof2 <<= 1;
}

<pre><code>// restar el número a powerof2 -1
return powerof2 – 1 – num;
</code></pre>

}
</code></pre>

};

<pre><code><br />Contenido de la función <code>main</code>.

Se asume que se han incluido todas las cabeceras. <code>findComplement</code> invierte los bits de un número. Por ejemplo, el número entero 5 es "101" en binario y su complemento es "010", que es el número entero 2.

“`c++
int main() {

#ifndef ONLINE_JUDGE

freopen(“in.txt”, “r”, stdin);
freopen(“out.txt”, “w”, stdout);
#endif

// variables auxiliares
Solution answer;
int testcase;

// leer el archivo de entrada, calcular la respuesta y escribir en el archivo de salida
while (std::cin) {
std::cin >> testcase;
std::cout << answer.findComplement(testcase) << “\n”;
}
return 0;
}

Contenido de in.txt

5
1
1000
120

Contenido de out.txt

2
0
23
7
7
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El 7 adicional al final de out.txt se debe a que el bucle while en la función principal (main) continúa ejecutándose incluso después de alcanzar el final del archivo in.txt. Esto significa que la instrucción std::cin >> testcase fallará y el último valor de testcase no será actualizado. Como resultado, cuando se llama a answer.findComplement(testcase) por última vez, devolverá un valor basura que se escribe como un 7 adicional en out.txt.

    Para solucionar esto, podemos modificar el bucle while para verificar el éxito de la instrucción de entrada de la siguiente manera:

    c++
    while (std::cin >> testcase) {
    std::cout << answer.findComplement(testcase) << "\n";
    }

    Con esta modificación, el bucle terminará tan pronto como no haya más entrada para leer de in.txt, y el 7 adicional no se imprimirá en out.txt.

Comments are closed.