La función de escritura () C no funciona

Estoy tratando de escribir en un archivo, pero no está funcionando. Puedo abrir un archivo, pero mientras escribo en el archivo con la función de escritura, tt está escribiendo en la propia salida estándar, y el contenido del archivo que abrí permanece sin cambios.

#include #include #include #include #include #include #include #include main() { char fn[30]; int fd,i=0; int actualbytes,bytesstored; char buffer[100]; printf("\nEnter the filename with path"); scanf("%s",fn); if(fd=open(fn,O_WRONLY|O_CREAT,S_IWUSR|S_IWUSR)<0) { perror("open"); exit(0); } else { write(stdout,"\n\nEnter the contents for the file\n"); write(stdout,"press CTRl+D at the end of the file\n\n"); fflush(stdout); while((buffer[i]=getc(stdin))!=EOF) i++; buffer[i]='\0'; bytesstored=sizeof(buffer); if(actualbytes=write(fd,buffer,bytesstored)<0) { perror("write"); exit(0); } else { write(stdout,"\n\nfile is opened successfully"); write(stdout,"\nThe contents are written"); fflush(stdout); } if(close(fd)<0) { perror("close"); exit(0); } else printf("\nfile is closed"); } } 

< tiene precedencia más alta que = .

 if((fd=open(fn,O_WRONLY|O_CREAT,S_IWUSR|S_IWUSR))<0) 

Hay muchos problemas con este código. Asegúrate de habilitar las advertencias en tu comstackdor, debería quejarse de algunas cosas:

write() está en unistd.h . No estás incluyendo eso, por lo que tu progtwig no puede ser correcto. Una vez que lo incluya, notará (con las advertencias activadas) que lo llama incorrectamente al menos 5 veces: stdout no es un descriptor de archivos, es un FILE* .

Utilice la familia de funciones printf() para imprimir cosas en la consola.

El segundo gran problema es su if declaraciones que tienen asignaciones en ellos.

 if (a = b < 0) { ... } 

es equivalente a:

 if (a = (b < 0)) { ... } 

Así que no está haciendo lo que piensas que es. Necesitas usar paréntesis:

 if ((fd = open(...)) < 0) { ... } 

Nota: siempre estás escribiendo el búfer completo en el archivo. No todo ha sido inicializado. Eso no suena como lo que buscas. Intente escribir solo los datos que ha leído (los tiene almacenados en i ).

Tenga en cuenta, desde stdin(3) :

  #include  extern FILE *stdin; extern FILE *stdout; extern FILE *stderr; 

stdin , stdout , son flujos IO FILE * estándar, para usar con fprintf(3) , fgets(3) , etc.

read(2) y write(2) toman filedescriptors (que se representan como int s).

Mantener separados los flujos de IO estándar suministrados por C y los descriptores de archivos provistos por Unix en tu mente es vital para la sana progtwigción de Unix; lo siento, es complicado 🙂 pero vale la pena convertirse en un experto.

Sugiero cambiar toda tu write(stdout,... a fprintf(stdout,...

Ah, veo que Ignacio ha detectado el problema principal 🙂 es difícil dejarlo atrás.

Otro problema del que preocuparse, su llamada scanf() no limita la longitud de la entrada al tamaño de su búfer. Alguien podría desbordar el búfer y los datos de garabatos de su elección en toda la memoria. No es un gran problema cuando estás aprendiendo, pero este tipo de error es exactamente cómo el primer gusano de Internet infectó algunas máquinas nuevas, por lo que vale la pena no volver a cometer el mismo error.

Y el último problema que detecté es cómo estás escribiendo tu búfer:

 buffer[i]='\0'; bytesstored=sizeof(buffer); if(actualbytes=write(fd,buffer,bytesstored)<0) 

sizeof(buffer) siempre devolverá 100 , porque eso es lo que declaró para el buffer al inicio de su progtwig. Entonces reemplaza con esto:

 buffer[i++]='\0'; if(actualbytes=write(fd,buffer,i)<0) 

Como los demás señalaron, hay muchos problemas con su código. Siempre instruye a tu comstackdor para que muestre advertencias. Si está utilizando GCC, pase el argumento -Wall para mostrar todas las advertencias. Ahora, si lo hago con su código, sugiere lo siguiente:

 write.c:9: warning: return type defaults to 'int' write.c: In function 'main': write.c:18: warning: suggest parentheses around assignment used as truth value write.c:25: warning: implicit declaration of function 'write' write.c:34: warning: suggest parentheses around assignment used as truth value write.c:45: warning: implicit declaration of function 'close' write.c:55: warning: control reaches end of non-void function 

El primero significa que su función main() predeterminada a int pero siempre debe indicar un tipo de retorno. En la línea 18 y 34 necesita paréntesis alrededor de las tareas antes de probar con <(como dijo Ignacio más arriba). En las líneas 25 y 45 no puede encontrar el prototipo para write() y close() , por lo que debe incluir los archivos de encabezado correctos. El último significa que necesita tener una statement de return (porque el valor predeterminado es escribir int ).

Simplemente incluya y la advertencia desaparecerá.