Descripción general:
C tiene dos conjuntos de archivos binarios de flujo para leer y escribir en UNIX: fread() y fwrite(). fwrite() es una función que escribe en un ARCHIVO*, que es (posiblemente) un flujo de stdio almacenado en búfer. La norma ISO C lo especifica. Además, fwrite() es seguro para subprocesos hasta cierto punto en las plataformas POSIX. El estándar POSIX define la escritura como una API de nivel inferior basada en descriptores de archivos. Desconoce el concepto de almacenamiento en búfer. Si desea usarlo en un ARCHIVO*, use el archivo para obtener su descriptor de archivo, pero bloquee y vacíe la secuencia manualmente antes de realizar la escritura. A menos que esté seguro de lo que está haciendo, use fwrite().
Nota:
una cosa a tener en cuenta es que acceder a una estructura FILE* desde varios subprocesos (lo que incluye, entre otros, ejecutar fread/fwrite) suele ser más arriesgado que hacerlo con descriptores de archivo de bajo nivel.
Quitar:
- La función de escritura es una llamada al sistema operativo realizada por su aplicación, es más lenta que fwrite().
- También carece de almacenamiento en búfer, lo que lo hace considerablemente lento porque, como implica la teoría del almacenamiento en búfer, «es más rápido procesar varios archivos pequeños que uno grande».
- También vale la pena señalar que escribir no es parte del estándar C, por lo que no lo encontrará en sistemas que no sean POSIX, y el uso apropiado puede cambiar (raramente).
- También vale la pena señalar que escribir y leer a veces se usan para implementar fwrite() y fread() (se puede encontrar una implementación simple en el capítulo sobre Unix de K&R).
- Una distinción más entre write y fwrite es que write es atómica mientras que fwrite no lo es.
Ejemplo:
considere el siguiente ejemplo de código de la siguiente manera.
Ejemplo de código-1:
C
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> int main() { if (fork() == 0) { // open file for append //Checking if fork is really 0 FILE* h = fopen("file.txt", "a"); // line is a pointer which is of char type char* line = "gggggggggggggggggggggggggggggggggggggggggggggggg\n"; // logic if condition not match // then line will not be append to file. //Looping till the condition of printing is not fulfilled! for (int i = 0; i < 1000; i++) { if (write(fileno(h), line, strlen(line)) != strlen(line)) { perror("Could not append line to file"); //There was some error, this is exception handling exit(1); } } // close file on the basis of condition if (fclose(h) != 0) { perror("Could not close file"); exit(1); } } else { //Opening and Writing on a Text File FILE* h = fopen("file.txt", "a"); char* line = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"; for (int i = 0; i < 1000; i++) { if (write(fileno(h), line, strlen(line)) != strlen(line)) { perror("Could not append line to file"); exit(1); } } if (fclose(h) != 0) { perror("Could not close file"); //Exception Handling if file could not be closed exit(1); } } return 0; }
Producción :
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb gggggggggggggggggggggggggggggggggggggggggggggggg bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb gggggggggggggggggggggggggggggggggggggggggggggggg bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb gggggggggggggggggggggggggggggggggggggggggggggggg bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb gggggggggggggggggggggggggggggggggggggggggggggggg bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
Ejemplo de código 2:
como puede ver, no hay líneas intercaladas en la salida. Ahora, considere este código de ejemplo de la siguiente manera.
C
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> int main() { //Checking the fork condition again if (fork() == 0) { FILE* h = fopen("file.txt", "a"); //Creating a char line, similar to the code above char* line = "gggggggggggggggggggggggggggggggggggggggggggggggg\n"; for (int i = 0; i < 1000; i++) { if (fwrite(line, 1, strlen(line), h) != strlen(line)) { perror("Could not append line to file"); //Exception Handling exit(1); } } if (fclose(h) != 0) { perror("Could not close file"); //File could not be closed exit(1); } } else { //Opening the file again FILE* h = fopen("file.txt", "a"); char* line = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb\n"; for (int i = 0; i < 1000; i++) { if (fwrite(line, 1, strlen(line), h) != strlen(line)) { perror("Could not append line to file"); //Exception Handling exit(1); } } if (fclose(h) != 0) { perror("Could not close file"); exit(1); } } return 0; }
Producción :
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbggggggggggggggggggggggggggggggggggggg ggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggg gggggggggggggggggggggggggggggggggggggggggggggggg
Conclusión:
Aquí entran en juego las líneas de la entrevista, por lo que se estipula que la última sea no atómica y la primera atómica. Espero que esto elimine la más mínima diferencia entre fwrite() y write(). La diferencia es pequeña, ¡solo cambian los factores clave!
Publicación traducida automáticamente
Artículo escrito por icloudanshu y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA