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.

Llamada al sistema obteniendo un valor basura en el archivo.

Estoy intentando escribir en un archivo utilizando la llamada al sistema write, la ruta del archivo se pasa a través del argumento de línea de comandos. Estoy obteniendo algún valor basura y no logro entender por qué está sucediendo esto.

“`c

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

#define FOUR 4

void odd_no(int fd)
{
for (int i = 0; i < 20; i++)
{
if (i % 2 != 0)
{
write(fd, &i, FOUR);
}
}
}

int main(int argc, char *argv[])
{
int fd;
if (argc < 2)
{
printf("Argumentos insuficientes\n");
return 0;
}

if ((fd = open(argv[1], O_WRONLY, S_IRWXU)) != -1)
{
odd_no(fd);
close(fd);
}
else
{
perror("open");
exit(1);
}
return 0;
}
“`</unistd.h></stdlib.h></fcntl.h></stdio.h>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el fragmento de código intenta escribir números impares del 1 al 39 en un archivo cuya ruta se pasa a través de los argumentos de la línea de comandos. Sin embargo, el código no verifica si el archivo se ha abierto correctamente ni maneja los errores relacionados con la llamada al sistema de escritura.

    El problema con el código podría ser que el archivo no se está abriendo con las banderas adecuadas. Actualmente, la llamada al sistema de apertura está utilizando la bandera O_WRONLY, que solo permite escribir en el archivo y crea un nuevo archivo si no existe. Si el archivo ya existe, truncará su contenido. Esto podría causar un comportamiento inesperado si el archivo ya tiene datos en él.

    Para evitar este tipo de problemas, se recomienda abrir el archivo en modo de apendizaje, lo que permite escribir al final del archivo y preservar su contenido existente. Además, sería mejor verificar si el archivo se abrió correctamente y manejar los errores relacionados con la llamada al sistema de escritura.

    Aquí tienes un fragmento de código actualizado con las modificaciones sugeridas:

    #include <stdio.h>
    #include <fcntl.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #define FOUR 4
    
    void odd_no (int fd)
    {
      for (int i = 1; i <= 39; i++)
      {
        if (i % 2 != 0)
        {
          if (write(fd, &i, FOUR) < 0) {
            perror("write");
            exit(1);
          }
        }
      }
    }
    
    int main (int argc, char *argv[])
    {
      int fd;
      if (argc < 2)
      {
        printf ("Argumentos insuficientes\n");
        return 0;
      }
    
      if ((fd = open(argv[1], O_WRONLY | O_APPEND | O_CREAT, S_IRUSR | S_IWUSR)) != -1)
      {
        odd_no(fd);
        close(fd);
      }
      else
      {
        perror ("open");
        exit(1);
      }
    
      return 0;
    }
    

    En el código actualizado, el archivo se abre con las banderas O_APPEND y O_CREAT. La bandera O_APPEND asegura que los datos se escriban al final del archivo, y la bandera O_CREAT crea un nuevo archivo si no existe.

    La llamada al sistema de escritura también se incluye en un bloque if para verificar cualquier error. En caso de producirse un error, se llama a la función perror para imprimir el mensaje de error y se termina el programa con exit(1).

    Estas modificaciones deberían asegurar que el programa escriba correctamente los números impares en el archivo sin valores basura y maneje cualquier error relacionado con el manejo de archivos y las llamadas al sistema.</unistd.h></stdlib.h></fcntl.h></stdio.h>

Comments are closed.