Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Section 7Subclause 7.21.5.3 of the C Standard [ISO/IEC 9899:2011] places the following restrictions on update streams:

...

Code Block
bgColor#ffcccc
langc
#include <stdio.h>
 
enum { BUFFERSIZE = 32 };
extern void initialize_data(char *data, size_t size);
 
void func(const char *file_name) {
  char data[BUFFERSIZE];
  char append_data[BUFFERSIZE];
char *file_name;
  FILE *file;

/* Initialize file_name */

file = fopen(file_name, "a+");
  if (file == NULL) {
    /* Handle error */
  }
 
/* Initialize initialize_data(append_data, */BUFFERSIZE);

  if (fwrite(append_data, BUFFERSIZE, 1, file) != BUFFERSIZE) {
    /* Handle error */
  }
  if (fread(data, BUFFERSIZE, 1, file) != 0) {
    /* Handle there not being data */
  }

  fclose(file);
}

However, because the stream is not flushed between the call to fread() and fwrite(), the behavior is undefined.

...

Code Block
bgColor#ccccff
langc
#include <stdio.h>
 
enum { BUFFERSIZE = 32 };
extern void initialize_data(char *data, size_t size);
 
void func(const char *file_name) {
  char data[BUFFERSIZE];
  char append_data[BUFFERSIZE];
char *file_name;
  FILE *file;

/* Initialize file_name */

file = fopen(file_name, "a+");
  if (file == NULL) {
    /* Handle error */
  }

/* Initialize initialize_data(append_data, */

BUFFERSIZE);
  if (fwrite(append_data, BUFFERSIZE, 1, file) != BUFFERSIZE) {
    /* Handle error */
  }

  if (fseek(file, 0L, SEEK_SET) != 0) {
    /* Handle error */
  }

  if (fread(data, BUFFERSIZE, 1, file) != 0) {
    /* Handle there not being data */
  }

  fclose(file);
}

Risk Assessment

Alternately inputting and outputting from a stream without an intervening flush or positioning call results in undefined behavior.

...

Bibliography

[ISO/IEC 9899:2011]Section Subclause 7.21.5.3, "The fopen Function"

...