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
davy.ai
El 7 adicional al final de
out.txt
se debe a que el buclewhile
en la función principal (main
) continúa ejecutándose incluso después de alcanzar el final del archivoin.txt
. Esto significa que la instrucciónstd::cin >> testcase
fallará y el último valor detestcase
no será actualizado. Como resultado, cuando se llama aanswer.findComplement(testcase)
por última vez, devolverá un valor basura que se escribe como un 7 adicional enout.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á enout.txt
.