ISO/IEC TS 17961 [ioileave]

Перемежение потоковых вводов и выходных параметров без сброса или расположение вызова

Описание

Управляйте определением

Перемежение потоковых вводов и выходных параметров без сброса или расположение call.[1]

Реализация Polyspace

Это средство проверки проверяет на Чередование ввода и вывода от потока без сброса или расположения вызова.

Примеры

развернуть все

Проблема

Чередование ввода и вывода от потока без сброса или расположение вызова происходят когда:

  • Вы не выполняете сброс или вызов расположения функции между выходной операцией и следующей входной операцией на потоке файла в режиме обновления.

  • Вы не выполняете вызов расположения функции между входной операцией и следующей выходной операцией на потоке файла в режиме обновления.

Риск

Чередование операций ввода и вывода на потоке без прошедшего сброса или расположение вызова являются неопределенным поведением.

Фиксация

Вызовите fflush() или расположение файла функционирует, такие как fseek() или fsetpos() между выходом и входными операциями на потоке обновления.

Вызовите функцию расположения файла между операциями ввода и вывода на потоке обновления.

Пример - чтение после записи без прошедшего сброса
#include <stdio.h>
#define SIZE20 20

void initialize_data(char* data, size_t s) {};
const char *temp_filename = "/tmp/demo.txt";

void func()
{
    char data[SIZE20];
    char append_data[SIZE20];
    FILE *file;

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

    initialize_data(append_data, SIZE20);

    if (fwrite(append_data, 1, SIZE20, file) != SIZE20)
      {
        (void)fclose(file);
        /* Handle error. */;
      }
	/* Read operation after write without 
	intervening flush. */
    if (fread(data, 1, SIZE20, file) < SIZE20)  
      {
          (void)fclose(file);
          /* Handle error. */;
      }

    if (fclose(file) == EOF)
      {
        /* Handle error. */;
      }
}
        
      

В этом примере, файл demo.txt открыт для чтения и добавления. После вызова fwrite(), вызов fread() без прошедшего сброса операция является неопределенным поведением.

Коррекция — вызывает fflush() Перед операцией чтения

После записывания данные к файлу, прежде, чем вызвать fread(), выполните вызов сброса.

#include <stdio.h>
#define SIZE20 20

void initialize_data(char* data, size_t s) {};
const char *temp_filename = "/tmp/demo.txt";


void func()
{
    char data[SIZE20];
    char append_data[SIZE20];
    FILE *file;

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

    initialize_data(append_data, SIZE20);

    if (fwrite(append_data, 1, SIZE20, file) != SIZE20)
      {
        (void)fclose(file);
        /* Handle error. */;
      }
	/* Buffer flush after write and before read */
    if (fflush(file) != 0)  
      {
        (void)fclose(file);
        /* Handle error. */;
      }
    if (fread(data, 1, SIZE20, file) < SIZE20)
      {
        (void)fclose(file);
        /* Handle error. */;
      }

    if (fclose(file) == EOF)
      {
        /* Handle error. */;
      }
} 

Проверяйте информацию

Разрешимость: неразрешимый
Введенный в R2019a

[1]  Выписки из стандарта "Техническая характеристика ISO/IEC TS 17961 - 2013-11-15" воспроизводятся с соглашением о AFNOR. Только исходный и полный текст стандарта, как опубликовано Выпусками AFNOR - доступный через веб-сайт www.boutique.afnor.org - имеет нормативное значение.