fwrite() Vs escribir()

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:

  1. La función de escritura es una llamada al sistema operativo realizada por su aplicación, es más lenta que fwrite().
  2. 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».
  3. 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).
  4. 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).
  5. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *