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.

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>

Tags:  ,

Answer

  1. Avatar for 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 a fscanf, 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. Si fscanf 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;
    }
    “`

Comments are closed.