Dirección de variable suministrada en lugar de su valor
Estoy probando un ejemplo de fopen
y fclose
en C++ donde el código lee los valores enteros en el archivo, pero si el archivo está vacío (sin enteros), el valor obtenido no es 0 sino -858993460
. Creo que esta es la dirección de la variable en fscanf()
, pero cómo puedo obtener el valor null
o /0
.
El siguiente código es problemático:
#include <stdio.h>
int main()
{
int a, sum = 0, num, n = 0;
FILE* pFile;
pFile = fopen("input.txt", "r");
fscanf(pFile, "%d", &num);
while (n != 5) {
n = n + 1;
sum = sum + num;
fscanf(pFile, "%d", &num);
}
fclose(pFile);
printf("He leído: %d números y la suma es %d \n", n, sum);
scanf("Hola %d", &a);
return 0;
}
El archivo de entrada input.txt
puede estar vacío o contener los siguientes valores:
12 32 43 56 78
NOTA: el código es problemático porque num
nunca se lee como 0
, por lo que el bucle continúa.
Añadiré más detalles sobre el problema: si el archivo de entrada contiene cinco enteros:
12 32 43 56 78
y el código es el siguiente:
#include <stdio.h>
int main()
{
char str[80];
int a, sum = 0, num, n = 0;
FILE* pFile;
pFile = fopen("input.txt", "r");
fscanf(pFile, "%d", &num);
while (n != 5) {
n = n + 1;
sum = sum + num;
fscanf(pFile, "%d", &num);
}
fclose(pFile);
printf("He leído: %d números y la suma es %d \n", n, sum);
scanf("Hola %d", &a);
return 0;
}
La salida será:
He leído: 5 números y la suma es 221
</stdio.h></stdio.h>
davy.ai
El valor recuperado (-858993460) es el valor predeterminado de una variable int no inicializada. En el código proporcionado,
num
no está inicializado antes de la primera llamada afscanf
, por lo que su valor puede ser cualquier cosa.Para comprobar si
fscanf
ha leído correctamente un valor entero del archivo, puedes verificar el valor de retorno de la función.fscanf
devuelve la cantidad de valores leídos correctamente, que se puede comparar con la cantidad esperada de valores para detectar errores. Sifscanf
devuelve 0, significa que no se ha leído ningún valor del archivo, por lo que puedes manejar este caso adecuadamente (por ejemplo, salir del bucle).Aquí hay una versión actualizada del código que verifica los errores de
fscanf
y maneja adecuadamente el caso de archivo vacío:“`c++
#include
int main()
{
int a, sum = 0, num, n = 0;
FILE* pFile;
pFile = fopen(“input.txt”, “r”);
if (pFile == nullptr) {
printf(“No se pudo abrir el archivo\n”);
return 1;
}
while (n != 5) {
if (fscanf(pFile, “%d”, &num) != 1) {
// No se pudo leer un entero, manejar el error o salir del bucle.
break;
}
n = n + 1;
sum = sum + num;
}
fclose(pFile);
if (n == 0) {
printf(“El archivo está vacío\n”);
} else {
printf(“He leído: %d números y la suma es %d\n”, n, sum);
}
scanf(“Hola %d”, &a);
return 0;
}
“`