Ferror проверка признака ошибки в файле


Содержание

Функции обработки ошибок

Int ferror(FILE *file) —возвращает нулевое значение, если последняя операция ввода/вывода с указанным файлом закончилась успешно, иначе ‑ нену­ле­вое значение.

void clearerr(FILE *file) —устанавливается в нуль состояние признака ошибки в указанном файле.

Пример программы создания справочника товара spravtov.txt

int main(int argc, char **argv) // основная функция

FILE *nf; // объявление файловой переменной nf*

if (( nf=fopen(«spravtov.txt»,»w»))==0) // проверка открытия spravtov.txt

printf(«\n Название товара?»); scanf(«%s»,&zstovar.nt); // ввод fseek(nf,(zstovar.kt-1)*sizeof(zstovar),0);// установка на запись с номером=kt

fwrite(&zstovar,sizeof(zstovar),1,nf); // вывод записи zstovar в файл spravtov

> /* конец тела цикла */ fclose(nf); // закрытие файла spravtov.txt

> // конец тела основной функции

6.5.2. Файлы в С++

При работе с файлами (#include ) используются поточные клас­сы ifstream(чте­ние), ofstream(запись), fstream(чтение и запись). Описание потоков приводится в файле Cbuilder5\Help\IOS&CR.DOC.

Перед открытием файла следует создать поточный объект в виде: . В консольных при­ло­жениях поточные объекты под именами coutи cinзадают стандартный вы­вод на экран и ввод с клавиатуры и не требуют сво­его создания, откры­тия и закрытия и могут быть переопределены в коман­д­ной строке на файлы. Открытие файла выполняется отдельно методом open( , ) или сразу при создании поточного объекта (ofstream file(«Tovari.txt»);).

Режимы задаются в виде: ios:: |ios:: | ios:: .

Перечислим основные режимы: in (ввод), out (вывод), binary (бинарный файл), app (дозапись в конец файла), ate (установить указатель в конец файла), trunc (очистка файла).

Пример открытия файла на запись и его закрытия:

ofstream file; file.open(«Tovari.txt», ios::out|ios::app); file.close();

Операторы включения ( >) записывают и чи­тают данные из файла. Опера­тор извлечения останавливается на первом символе-разделителе (сим­волы про­бела, табуляции и новой строки). Таким образом нельзя ввести зна­че­ние из нескольких слов в отличие от мето­да getline. В данных опе­раторах можно использовать модификаторы для форматирования дан­ных (#include ): endl/ends(вставка символа новой/конца строки), dec/hex/oct(перевод в десятич­ное/шес­т­над­цати­рич­ное/вось­меричное чис­ло), ws (извлечение про­белов), flush(очистка ost­ream), setfill(‘ ’) (установка символа заполните­ля), setprecision(n) (точ­ность вещественных чисел в n разрядов), setw(n) (ши­рина поля n).

Основные методы класса ofstream: open(открытие), put(запись сим­вола), write(запись заданного числа символов), seekp(установка ука­за­те­ля на нужный байт), tellp(возвращает значение указателя), close(за­кры­тие). Основные методы класса ifstream: open(открытие), get(чтение), getline(чтение строки), read(чтение заданного числа байтов), eof(true, достигнут конец файла), peek(выдает очередной символ, но не выбирает его), seekg(установка указателя на нужный байт), tellg(возвращает значение указателя), close(закрытие).

Пример создания текстового файла «Tovari.txt»:

int main(int argc, char **argv) <

ofstream file («Tovari.txt»); //создание объекта file и открытие файла

file >kod>>cena>>ws;//чтение в переменные kod и cena, пропуск пробелов

cout > zstovar.kt; // ввод код товара в kt

if (zstovar.kt 10) break; // выход из цикла ввода

cout > zstovar.nt; // ввод наименования товара

file.write((char*)&zstovar,sizeof(zstovar)); // вывод записи zstovar в spravtov

> /* конец тела цикла */ file.close(); // закрытие файла spravtov.txt

ifstream infile(«spravtov.txt»,ios::binary); // открытие файла для чтения

while(!infile.read((char*)&zstovar,sizeof(zstovar)).eof())//цикл чтения записей

ifstream infile(«spravtov.txt»,ios::binary); // открытие файла для чтения

infile.seekg(1*sizeof(zstovar));//установка указателя на начало 2-й записи

infile.read((char*)&zstovar,sizeof(zstovar)); // чтение второй записи

cout = newTFileStream( , );

Режимы открытия файла: FmCreate(создание файла; если он уже су­щест­вует, то открыть его для записи), fmOpen­Read(открыть файл для чтения), fmOpenWrite(открыть файл для записи с полной заменой теку­ще­го содер­жа­ния), fmShareExclusive/fmShareDeny­No­ne(монопольное/кол­лек­тив­ное ис­поль­зование файла), fmShareDenyWrite/fmShareDenyRead(ко­л­­­лективное использование фай­ла по чтению/записи).

Пример. Разместим на форме кнопку Button1 и объект Memo1. Сос­тавим процедуру обработки события Click для этой кнопки:

void __fastcall TForm1::Button1Click(TObject *Sender) // процедура

<struct stovar zstovar; // объявление переменной-записи

char str[30]; // создадим далее объект file и откроем создаваемый файл

TFileStream* file = new TFileStream(«spravtov.txt»,fmCreate); // открытие

stovar zst1=<1, «масло крестьянское»>; // значения полей первой записи zst1

stovar zst2=<2, «масло подсолнечное»>;// значения полей второй записи zst2

file->Position=(zst1.kt-1)*sizeof(zst1); // установка на запись под номером kt

file->Write(&zst1,sizeof(zst1));//вывод записи zst1 под номером kt в spravtov


file->Position=(zst2.kt-1)*sizeof(zst2); // установка на запись под номером kt

file->Write(&zst2,sizeof(zst2));//вывод записи zst2 под номером kt в spravtov

delete file; // удаление объекта file c закрытием файла spravtov.txt

//создание объекта infile и открытие файла spravtov.txt для чтения

TFileStream* infile = new TFileStream(«spravtov.txt»,fmOpenRead);

Memo1->Clear(); // очистка объекта Memo1

while(infile->Read(&zstovar,sizeof(zstovar))>0) // цикл чтения записей

Memo1->Lines->Add(str); // добавление строки str в массив строк Memo1

>delete infile; /*удаление объекта infile c закрытием файла spravtov.txt*/ >

6.6. Объектно‑ориентированное программирование

Дата добавления: 2020-03-22 ; просмотров: 465 ; ЗАКАЗАТЬ НАПИСАНИЕ РАБОТЫ

Обнаружение и исправление ошибок. Корректирующее кодирование. Коды с обнаружением ошибок

Стратегии борьбы с ошибками:

— использование корректирующих кодов или кодами с исправлением ошибок (error-correcting codes), прямое исправление ошибок FEC.

— коды с обнаружением ошибок (error-detecting codes).

Для того чтобы определить, какой метод лучше подойдет в конкретной ситуации, нужно понять, какой тип ошибок более вероятен. Ни код с исправлением ошибок, ни код с обнаружением ошибок не позволят справиться со всеми возможными ошибками, поскольку лишние биты, передаваемые для повышения надежности, также могут быть повреждены в пути.

Коды с исправлением ошибок добавляют к пересылаемой информации избыточные данные. Кадр состоит из m бит данных (то есть информационных бит) и r избыточных или контрольных бит.

Набор из n бит, содержащий информационные и контрольные биты, часто называют n-битовым кодовым словом. Кодовая норма — это часть кодового слова, несущая неизбыточную информацию, или m/n. Количество бит, которыми отличаются два кодовых слова, называется кодовым расстоянием или расстоянием между кодовыми комбинациями в смысле Хэмминга. Смысл этого числа состоит в том, что если два кодовых слова находятся на кодовом расстоянии d, то для преобразования одного кодового слова в другое понадобится d ошибок в одиночных битах.

1. Коды Хэмминга биты кодового слова нумеруются последовательно слева направо, начиная с 1. Биты с номерами, равными степеням 2 (1, 2, 4, 8, 16 и т. д.), являются контрольными. Остальные биты (3, 5, 6, 7, 9, 10 и т. д.) заполняются m битами данных.

Каждый контрольный бит обеспечивает сумму по модулю 2 или четность некоторой группы бит, включая себя самого. Один бит может входить в несколько вычислений контрольных бит. Чтобы определить, в какие группы контрольных сумм будет входить бит данных в k-й позиции, следует разложить k по степеням числа 2. Например, 11 = 8 + 2 + 1, а 29 = 16 + 8 + 4 + 1. Каждый бит проверяется только теми контрольными битами, номера которых входят в этот ряд разложения (например, 11-й бит проверяется битами 1, 2 и 8). В нашем примере контрольные биты вычисляются для проверки на четность в сообщении, представляющем букву «A» в кодах ASCII.

2. Двоичные сверточные коды не относятся к блочному типу и применяется в развернутых сетях (GSM, 802.11). Кодировщик обрабатывает последовательность входных бит и генерирует последовательность выходных бит. В отличие от блочного кода, ни- какие ограничения на размер сообщения не накладываются, также не существует грани кодирования. начение выходного бита зависит от значения текущего и предыдущих входных бит — если у кодировщика есть возможность использовать память. Число предыдущих бит, от которого зависит выход, называется длиной кодового ограничения для данного кода. Сверточные коды были очень популярны для практического применения, так как в декодировании очень легко учесть неопределенность значения бита (0 или 1). Например, предположим, что –1 В соответствует логическому уровню 0, а +1 В соот- ветствует логическому уровню 1. Мы получили для двух бит значения 0,9 В и –0,1 В. Вместо того чтобы сразу определять соответствие — 1 для первого бита и 0 для вто- рого, — можно принять 0,9 В за «очень вероятную единицу», а –0,1 В за «возможный нуль» и скорректировать всю последовательность. Для более надежного исправления ошибок к неопределенностям можно применять различные расширения алгоритма Витерби. Такой подход к обработке неопределенности значения бит называется деко- дированием с мягким принятием решений (soft-decision decoding). И наоборот, если мы решаем, какой бит равен нулю, а какой единице, до последующего исправления ошибок, то такой метод называется декодированием с жестким принятием решений (hard-decision decoding).

3. Коды Рида—Соломона (используются в сетях DSL, для исправления ошибок н DVD и Blu-ray дисках) основываются на том, что каждый многочлен n-й степени уникальным образом определяется n + 1 точкой. Например, если линия задается формулой ax + b, то восстановить ее можно по двум точкам. Коды Рида—Соломона определяются как многочлены на конечных полях. Для m-битовых символов длина кодового слова составляет 2m – 1 символов. Очень часто выбирают значение m = 8, то есть одному символу соответствует один байт. Тогда длина кодового слова — 255 байт. Широко используется код (255,233), он добавляет 32 дополнительных символа к 233 символам данных. Декодирование с исправлением ошибок выполняется при помощи алгоритма Берлекэмпа—Мэсси, который осуществляет подгонку для кодов средней длины. При добавлении 2t избыточных символов код Рида—Соломона способен исправить до t ошибок в любом из переданных символов. Это означает, например, что код (255,233) с 32 избыточными символами исправляет до 16 ошибок. Так как символы могут быть последовательными, а размер их обычно составляет 8 бит, то возможно исправление последовательных ошибок в 128 битах. Коды Рида—Соломона часто используют в сочетании с другими кодами, например сверточными. Сверточные коды эффективно обрабатывают изолированные однобитные ошибки, но с последовательностью ошибок они не справятся, особенно если ошибок в полученном потоке бит слишком много. Добавив внутрь сверточного кода код Рида—Соломона, вы сможете очистить поток бит от последовательностей ошибок.

4. Коды с малой плотностью проверок на четность (LDPC) — это линейные блочные коды, изобретенные Робертом Галлагером. В коде LDPC каждый выходной бит формируется из некоторого подмножества входных бит. Это приводит нас к матричному представлению кода с низкой плотностью единиц. Полученные кодовые слова декодируются алгоритмом аппроксимации, который последовательно улучшает наилучшее приближение, составленное из полученных данных, пока не получает допустимое кодовое слово. Так осуществляется устранение ошибок. Коды LDPC удобно применять для блоков большого размера. По этой причине коды LDPC быстро добавляются в новые протоколы. Они являются частью стандарта цифрового телевидения, сетей Ethernet 10 Гбит/с, сетей, работающих по линиям электропитания, а также последней версии 802.11.

Коды с обнаружением ошибок:

1. Код с проверкой на четность.

К отправляемым данным присоединяется бит четности (parity bit), который выбирается так, чтобы число единичных битов в кодовом слове было четным (или нечетным). Для повышения защиты от последовательностей ошибок — биты четности вычисляют не в порядке отправки данных — чередование.

Не нашли то, что искали? Воспользуйтесь поиском:

Как искать и исправлять ошибки в коде

Искать ошибки в программах — непростая задача. Здесь нет никаких готовых методик или рецептов успеха. Можно даже сказать, что это — искусство. Тем не менее есть общие советы, которые помогут вам при поиске. В статье описаны основные шаги, которые стоит предпринять, если ваша программа работает некорректно.

Шаг 1: Занесите ошибку в трекер

После выполнения всех описанных ниже шагов может так случиться, что вы будете рвать на себе волосы от безысходности, все еще сидя на работе, когда поймете, что:

  1. Вы забыли какую-то важную деталь об ошибке, например, в чем она заключалась.
  2. Вы могли делегировать ее кому-то более опытному.

Трекер поможет вам не потерять нить размышлений и о текущей проблеме, и о той, которую вы временно отложили. А если вы работаете в команде, это поможет делегировать исправление коллеге и держать все обсуждение в одном месте.

Вы должны записать в трекер следующую информацию:

  1. Что делал пользователь.
  2. Что он ожидал увидеть.
  3. Что случилось на самом деле.

Это должно подсказать, как воспроизвести ошибку. Если вы не сможете воспроизвести ее в любое время, ваши шансы исправить ошибку стремятся к нулю.

Шаг 2: Поищите сообщение об ошибке в сети

Если у вас есть сообщение об ошибке, то вам повезло. Или оно будет достаточно информативным, чтобы вы поняли, где и в чем заключается ошибка, или у вас будет готовый запрос для поиска в сети. Не повезло? Тогда переходите к следующему шагу.

Шаг 3: Найдите строку, в которой проявляется ошибка

Если ошибка вызывает падение программы, попробуйте запустить её в IDE под отладчиком и посмотрите, на какой строчке кода она остановится. Совершенно необязательно, что ошибка будет именно в этой строке (см. следующий шаг), но, по крайней мере, это может дать вам информацию о природе бага.

Шаг 4: Найдите точную строку, в которой появилась ошибка

Как только вы найдете строку, в которой проявляется ошибка, вы можете пройти назад по коду, чтобы найти, где она содержится. Иногда это может быть одна и та же строка. Но чаще всего вы обнаружите, что строка, на которой упала программа, ни при чем, а причина ошибки — в неправильных данных, которые появились ранее.

Илон Маск рекомендует:  Что такое код fgetc


Если вы отслеживаете выполнение программы в отладчике, то вы можете пройтись назад по стектрейсу, чтобы найти ошибку. Если вы находитесь внутри функции, вызванной внутри другой функции, вызванной внутри другой функции, то стектрейс покажет список функций до самой точки входа в программу (функции main() ). Если ошибка случилась где-то в подключаемой библиотеке, предположите, что ошибка все-таки в вашей программе — это случается гораздо чаще. Найдите по стектрейсу, откуда в вашем коде вызывается библиотечная функция, и продолжайте искать.

Шаг 5: Выясните природу ошибки

Ошибки могут проявлять себя по-разному, но большинство из них можно отнести к той или иной категории. Вот наиболее частые.

  1. Ошибка на единицу
    Вы начали цикл for с единицы вместо нуля или наоборот. Или, например, подумали, что метод .count() или .length() вернул индекс последнего элемента. Проверьте документацию к языку, чтобы убедиться, что нумерация массивов начинается с нуля или с единицы. Эта ошибка иногда проявляется в виде исключения Index out of range .
  2. Состояние гонки
    Ваш процесс или поток пытается использовать результат выполнения дочернего до того, как тот завершил свою работу. Ищите использование sleep() в коде. Возможно, на мощной машине дочерний поток выполняется за миллисекунду, а на менее производительной системе происходят задержки. Используйте правильные способы синхронизации многопоточного кода: мьютексы, семафоры, события и т. д.
  3. Неправильные настройки или константы
    Проверьте ваши конфигурационные файлы и константы. Я однажды потратил ужасные 16 часов, пытаясь понять, почему корзина на сайте с покупками виснет на стадии отправки заказа. Причина оказалась в неправильном значении в /etc/hosts , которое не позволяло приложению найти ip-адрес почтового сервера, что вызывало бесконечный цикл в попытке отправить счет заказчику.
  4. Неожиданный null
    Бьюсь об заклад, вы не раз получали ошибку с неинициализированной переменной. Убедитесь, что вы проверяете ссылки на null , особенно при обращении к свойствам по цепочке. Также проверьте случаи, когда возвращаемое из базы данных значение NULL представлено особым типом.
  5. Некорректные входные данные
    Вы проверяете вводимые данные? Вы точно не пытаетесь провести арифметические операции с введенными пользователем строками?
  6. Присваивание вместо сравнения
    Убедитесь, что вы не написали = вместо == , особенно в C-подобных языках.
  7. Ошибка округления
    Это случается, когда вы используете целое вместо Decimal , или float для денежных сумм, или слишком короткое целое (например, пытаетесь записать число большее, чем 2147483647, в 32-битное целое). Кроме того, может случиться так, что ошибка округления проявляется не сразу, а накапливается со временем (т. н. Эффект бабочки).
  8. Переполнение буфера и выход за пределы массива
    Проблема номер один в компьютерной безопасности. Вы выделяете память меньшего объема, чем записываемые туда данные. Или пытаетесь обратиться к элементу за пределами массива.
  9. Программисты не умеют считать
    Вы используете некорректную формулу. Проверьте, что вы не используете целочисленное деление вместо взятия остатка, или знаете, как перевести рациональную дробь в десятичную и т. д.
  10. Конкатенация строки и числа
    Вы ожидаете конкатенации двух строк, но одно из значений — число, и компилятор пытается произвести арифметические вычисления. Попробуйте явно приводить каждое значение к строке.
  11. 33 символа в varchar(32)
    Проверяйте данные, передаваемые в INSERT , на совпадение типов. Некоторые БД выбрасывают исключения (как и должны делать), некоторые просто обрезают строку (как MySQL). Недавно я столкнулся с такой ошибкой: программист забыл убрать кавычки из строки перед вставкой в базу данных, и длина строки превысила допустимую как раз на два символа. На поиск бага ушло много времени, потому что заметить две маленькие кавычки было сложно.
  12. Некорректное состояние
    Вы пытаетесь выполнить запрос при закрытом соединении или пытаетесь вставить запись в таблицу прежде, чем обновили таблицы, от которых она зависит.
  13. Особенности вашей системы, которых нет у пользователя
    Например: в тестовой БД между ID заказа и адресом отношение 1:1, и вы программировали, исходя из этого предположения. Но в работе выясняется, что заказы могут отправляться на один и тот же адрес, и, таким образом, у вас отношение 1:многим.

Если ваша ошибка не похожа на описанные выше, или вы не можете найти строку, в которой она появилась, переходите к следующему шагу.

Шаг 6: Метод исключения

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

Попробуйте отключать компоненты системы один за другим, пока не найдете минимальную конфигурацию, которая будет работать. Затем подключайте их обратно по одному, пока ошибка не вернется. Таким образом вы вернетесь на шаг 3.

Шаг 7: Логгируйте все подряд и анализируйте журнал

Пройдитесь по каждому модулю или компоненту и добавьте больше сообщений. Начинайте постепенно, по одному модулю. Анализируйте лог до тех пор, пока не проявится неисправность. Если этого не случилось, добавьте еще сообщений.

Ваша задача состоит в том, чтобы вернуться к шагу 3, обнаружив, где проявляется ошибка. Также это именно тот случай, когда стоит использовать сторонние библиотеки для более тщательного логгирования.

Шаг 8: Исключите влияние железа или платформы

Замените оперативную память, жесткие диски, поменяйте сервер или рабочую станцию. Установите обновления, удалите обновления. Если ошибка пропадет, то причиной было железо, ОС или среда. Вы можете по желанию попробовать этот шаг раньше, так как неполадки в железе часто маскируют ошибки в ПО.

Если ваша программа работает по сети, проверьте свитч, замените кабель или запустите программу в другой сети.

Ради интереса, переключите кабель питания в другую розетку или к другому ИБП. Безумно? Почему бы не попробовать?

Если у вас возникает одна и та же ошибка вне зависимости от среды, то она в вашем коде.

Шаг 9: Обратите внимание на совпадения

  1. Ошибка появляется всегда в одно и то же время? Проверьте задачи, выполняющиеся по расписанию.
  2. Ошибка всегда проявляется вместе с чем-то еще, насколько абсурдной ни была бы эта связь? Обращайте внимание на каждую деталь. На каждую. Например, проявляется ли ошибка, когда включен кондиционер? Возможно, из-за этого падает напряжение в сети, что вызывает странные эффекты в железе.
  3. Есть ли что-то общее у пользователей программы, даже не связанное с ПО? Например, географическое положение (так был найден легендарный баг с письмом за 500 миль).
  4. Ошибка проявляется, когда другой процесс забирает достаточно большое количество памяти или ресурсов процессора? (Я однажды нашел в этом причину раздражающей проблемы «no trusted connection» с SQL-сервером).

Шаг 10: Обратитесь в техподдержку

Наконец, пора попросить помощи у того, кто знает больше, чем вы. Для этого у вас должно быть хотя бы примерное понимание того, где находится ошибка — в железе, базе данных, компиляторе. Прежде чем писать письмо разработчикам, попробуйте задать вопрос на профильном форуме.

Ошибки есть в операционных системах, компиляторах, фреймворках и библиотеках, и ваша программа может быть действительно корректна. Но шансы привлечь внимание разработчика к этим ошибкам невелики, если вы не сможете предоставить подробный алгоритм их воспроизведения. Дружелюбный разработчик может помочь вам в этом, но чаще всего, если проблему сложно воспроизвести вас просто проигнорируют. К сожалению, это значит, что нужно приложить больше усилий при составлении багрепорта.

Полезные советы (когда ничего не помогает)

  1. Позовите кого-нибудь еще.
    Попросите коллегу поискать ошибку вместе с вами. Возможно, он заметит что-то, что вы упустили. Это можно сделать на любом этапе.
  2. Внимательно просмотрите код.
    Я часто нахожу ошибку, просто спокойно просматривая код с начала и прокручивая его в голове.
  3. Рассмотрите случаи, когда код работает, и сравните их с неработающими.
    Недавно я обнаружил ошибку, заключавшуюся в том, что когда вводимые данные в XML-формате содержали строку xsi:type=’xs:string’ , все ломалось, но если этой строки не было, все работало корректно. Оказалось, что дополнительный атрибут ломал механизм десериализации.
  4. Идите спать.
    Не бойтесь идти домой до того, как исправите ошибку. Ваши способности обратно пропорциональны вашей усталости. Вы просто потратите время и измотаете себя.
  5. Сделайте творческий перерыв.
    Творческий перерыв — это когда вы отвлекаетесь от задачи и переключаете внимание на другие вещи. Вы, возможно, замечали, что лучшие идеи приходят в голову в душе или по пути домой. Смена контекста иногда помогает. Сходите пообедать, посмотрите фильм, полистайте интернет или займитесь другой проблемой.
  6. Закройте глаза на некоторые симптомы и сообщения и попробуйте сначала.
    Некоторые баги могут влиять друг на друга. Драйвер для dial-up соединения в Windows 95 мог сообщать, что канал занят, при том что вы могли отчетливо слышать звук соединяющегося модема. Если вам приходится держать в голове слишком много симптомов, попробуйте сконцентрироваться только на одном. Исправьте или найдите его причину и переходите к следующему.
  7. Поиграйте в доктора Хауса (только без Викодина).
    Соберите всех коллег, ходите по кабинету с тростью, пишите симптомы на доске и бросайте язвительные комментарии. Раз это работает в сериалах, почему бы не попробовать?

Что вам точно не поможет

  1. Паника
    Не надо сразу палить из пушки по воробьям. Некоторые менеджеры начинают паниковать и сразу откатываться, перезагружать сервера и т. п. в надежде, что что-нибудь из этого исправит проблему. Это никогда не работает. Кроме того, это создает еще больше хаоса и увеличивает время, необходимое для поиска ошибки. Делайте только один шаг за раз. Изучите результат. Обдумайте его, а затем переходите к следующей гипотезе.
  2. «Хелп, плиииз!»
    Когда вы обращаетесь на форум за советом, вы как минимум должны уже выполнить шаг 3. Никто не захочет или не сможет вам помочь, если вы не предоставите подробное описание проблемы, включая информацию об ОС, железе и участок проблемного кода. Создавайте тему только тогда, когда можете все подробно описать, и придумайте информативное название для нее.
  3. Переход на личности
    Если вы думаете, что в ошибке виноват кто-то другой, постарайтесь по крайней мере говорить с ним вежливо. Оскорбления, крики и паника не помогут человеку решить проблему. Даже если у вас в команде не в почете демократия, крики и применение грубой силы не заставят исправления магическим образом появиться.

Ошибка, которую я недавно исправил


Это была загадочная проблема с дублирующимися именами генерируемых файлов. Дальнейшая проверка показала, что у файлов различное содержание. Это было странно, поскольку имена файлов включали дату и время создания в формате yyMMddhhmmss . Шаг 9, совпадения: первый файл был создан в полпятого утра, дубликат генерировался в полпятого вечера того же дня. Совпадение? Нет, поскольку hh в строке формата — это 12-часовой формат времени. Вот оно что! Поменял формат на yyMMddHHmmss , и ошибка исчезла.

Ошибки при форматно-логической проверке

После определения формата отправляемых документов сервер зафиксировал ошибки в форматно-логическом контроле.

Примеры расширенной части сообщения:

  • Файл ON_SCHET_2BEcf64bba310444f5daed3cc864750e188_2BE7ed0b1f69af611e3845e005056b76e76_20140411_fc2c44c6-c131-11e3-ac8c-005056b74802.xml
    ошибки: [ Отсутствует обязательный атрибут \«Файл.Документ.СвСчет.СвПокуп.ИдСв.СвФЛ.ФИОИП.Имя\»]
  • Файл ON_SCHET_2BE50afaf555e874a7cbd5d0d5ab3abc4f0_2BE7ed0b1f69af611e3845e005056b76e76_20140411_4469965e-c13c-11e3-9f08-005056b74802.xml
    ошибки: [ Значение \«2/4стр23Б\» атрибута \«Файл.Документ.СвСчет.СвПокуп.Адрес.АдрРФ.Дом\» больше максимально допустимой длины (8)]

Причина № 1

Формат вложения документа не соответствует утвержденному формату.

Решение № 1

  1. Проверьте отправляемые вложения документа на соответствие утвержденным форматам. Исправьте формат вложений документа.
  2. Если при отправке вы указываете тип вложения («Документ.Вложение.Тип») — проверьте соответствие отправляемого значения реальному типу вложения.
  3. Повторите отправку документа.

Причина № 2

СБИС неправильно классифицирует неутвержденный формат и принимает его за утвержденный с ошибками.

Решение № 2

Обратитесь в техническую поддержку и предоставьте описание вашего формата документа. Мы дадим рекомендации к исправлению ошибки определения формата, либо зарегистрируем ваш формат в справочнике для загрузки.

Обработка ошибок в C

Введение

Переменная errno и коды ошибок

errno – переменная, хранящая целочисленный код последней ошибки. В каждом потоке существует своя локальная версия errno, чем и обусловливается её безопасность в многопоточной среде. Обычно errno реализуется в виде макроса, разворачивающегося в вызов функции, возвращающей указатель на целочисленный буфер. При запуске программы значение errno равно нулю.

Все коды ошибок имеют положительные значения, и могут использоваться в директивах препроцессора #if. В целях удобства и переносимости заголовочный файл определяет макросы, соответствующие кодам ошибок.

Стандарт ISO C определяет следующие коды:

  • EDOM – (Error domain) ошибка области определения.
  • EILSEQ – (Error invalid sequence) ошибочная последовательность байтов.
  • ERANGE – (Error range) результат слишком велик.

Прочие коды ошибок (несколько десятков) и их описания определены в стандарте POSIX. Кроме того, в спецификациях стандартных функций обычно указываются используемые ими коды ошибок и их описания.

Нехитрый скрипт печатает в консоль коды ошибок, их символические имена и описания:

Если вызов функции завершился ошибкой, то она устанавливает переменную errno в ненулевое значение. Если же вызов прошёл успешно, функция обычно не проверяет и не меняет переменную errno. Поэтому перед вызовом функции её нужно установить в 0 .

Как видите, описания ошибок в спецификации функции iconv() более информативны, чем в .

Функции работы с errno

Получив код ошибки, хочется сразу получить по нему её описание. К счастью, ISO C предлагает целый набор полезных функций.

void perror(const char *s);

Печатает в stderr содержимое строки s , за которой следует двоеточие, пробел и сообщение об ошибке. После чего печатает символ новой строки ‘\n’ .

char* strerror(int errnum);
Возвращает строку, содержащую описание ошибки errnum . Язык сообщения зависит от локали (немецкий, иврит и даже японский), но обычно поддерживается лишь английский.

strerror() не безопасная функция. Во-первых, возвращаемая ею строка не является константной. При этом она может храниться в статической или в динамической памяти в зависимости от реализации. В первом случае её изменение приведёт к ошибке времени выполнения. Во-вторых, если вы решите сохранить указатель на строку, и после вызовите функцию с новым кодом, все прежние указатели будут указывать уже на новую строку, ибо она использует один буфер для всех строк. В-третьих, её поведение в многопоточной среде не определено в стандарте. Впрочем, в QNX она объявлена как thread safe.

Илон Маск рекомендует:  Селекторы тегов

Поэтому в новом стандарте ISO C11 были предложены две очень полезные функции.

size_t strerrorlen_s(errno_t errnum);

Возвращает длину строки с описанием ошибки errnum .

errno_t strerror_s(char *buf, rsize_t buflen, errno_t errnum);

Копирует строку с описание ошибки errnum в буфер buf длиной buflen .

Функции входят в Annex K (Bounds-checking interfaces), вызвавший много споров. Он не обязателен к выполнению и целиком не реализован ни в одной из свободных библиотек. Open Watcom C/C++ (Windows), Slibc (GNU libc) и Safe C Library (POSIX), в последней, к сожалению, именно эти две функции не реализованы. Тем не менее, их можно найти в коммерческих средах разработки и системах реального времени, Embarcadero RAD Studio, INtime RTOS, QNX.

Стандарт POSIX.1-2008 определяет следующие функции:

char *strerror_l(int errnum, locale_t locale);

Возвращает строку, содержащую локализованное описание ошибки errnum , используя locale . Безопасна в многопоточной среде. Не реализована в Mac OS X, FreeBSD, NetBSD, OpenBSD, Solaris и прочих коммерческих UNIX. Реализована в Linux, MINIX 3 и Illumos (OpenSolaris).


int strerror_r(int errnum, char *buf, size_t buflen);

Копирует строку с описание ошибки errnum в буфер buf длиной buflen . Если buflen меньше длины строки, лишнее обрезается. Безопасна в многоготочной среде. Реализована во всех UNIX.

Увы, никакого аналога strerrorlen_s() в POSIX не определили, поэтому длину строки можно выяснить лишь экспериментальным путём. Обычно 300 символов хватает за глаза. GNU C Library в реализации strerror() использует буфер длиной в 1024 символа. Но мало ли, а вдруг?

Макрос assert()

Макрос, проверяющий условие expression (его результат должен быть числом) во время выполнения. Если условие не выполняется ( expression равно нулю), он печатает в stderr значения __FILE__ , __LINE__ , __func__ и expression в виде строки, после чего вызывает функцию abort() .

Функции atexit(), exit() и abort()

int atexit(void (*func)(void));

Регистрирует функции, вызываемые при нормальном завершении работы программы в порядке, обратном их регистрации. Можно зарегистрировать до 32 функций.

_Noreturn void exit(int exit_code);

Вызывает нормальное завершение программы, возвращает в среду число exit_code . ISO C стандарт определяет всего три возможных значения: 0 , EXIT_SUCCESS и EXIT_FAILURE . При этом вызываются функции, зарегистрированные через atexit() , сбрасываются и закрываются потоки ввода — вывода, уничтожаются временные файлы, после чего управление передаётся в среду. Функция exit() вызывается в main() при выполнении return или достижении конца программы.

Главное преимущество exit() в том, что она позволяет завершить программу не только из main() , но и из любой вложенной функции. К примеру, если в глубоко вложенной функции выполнилось (или не выполнилось) некоторое условие, после чего дальнейшее выполнение программы теряет всякий смысл. Подобный приём (early exit) широко используется при написании демонов, системных утилит и парсеров. В интерактивных программах с бесконечным главным циклом exit() можно использовать для выхода из программы при выборе нужного пункта меню.

_Noreturn void abort(void);

Вызывает аварийное завершение программы, если сигнал не был перехвачен обработчиком сигналов. Временные файлы не уничтожаются, закрытие потоков определяется реализацией. Самое главное отличие вызовов abort() и exit(EXIT_FAILURE) в том, что первый посылает программе сигнал SIGABRT , его можно перехватить и произвести нужные действия перед завершением программы. Записывается дамп памяти программы (core dump file), если они разрешены. При запуске в отладчике он перехватывает сигнал SIGABRT и останавливает выполнение программы, что очень удобно в отладке.

Вывод в отладчике:

В случае критической ошибки нужно использовать функцию abort() . К примеру, если при выделении памяти или записи файла произошла ошибка. Любые дальнейшие действия могут усугубить ситуацию. Если завершить выполнение обычным способом, при котором производится сброс потоков ввода — вывода, можно потерять ещё неповрежденные данные и временные файлы, поэтому самым лучшим решением будет записать дамп и мгновенно завершить программу.

В случае же некритической ошибки, например, вы не смогли открыть файл, можно безопасно выйти через exit() .

Функции setjmp() и longjmp()

Вот мы и подошли к самому интересному – функциям нелокальных переходов. setjmp() и longjmp() работают по принципу goto, но в отличие от него позволяют перепрыгивать из одного места в другое в пределах всей программы, а не одной функции.

int setjmp(jmp_buf env);

Сохраняет информацию о контексте выполнения программы (регистры микропроцессора и прочее) в env . Возвращает 0 , если была вызвана напрямую или value , если из longjmp() .

void longjmp(jmp_buf env, int value);

Восстанавливает контекст выполнения программы из env , возвращает управление setjmp() и передаёт ей value .

Используя setjmp() и longjmp () можно реализовать механизм исключений. Во многих языках высокого уровня (например, в Perl) исключения реализованы через них.

Внимание! Функции setjmp() и longjmp () в первую очередь применяются в системном программировании, и их использование в клиентском коде не рекомендуется. Их применение ухудшает читаемость программы и может привести к непредсказуемым ошибкам. Например, что произойдёт, если вы прыгните не вверх по стеку – в вызывающую функцию, а в параллельную, уже завершившую выполнение?

Ferror проверка признака ошибки в файле

ВНИМАНИЕ! Параметр F не указан.
CHKDSK выполняется в режиме только чтения.

Проверка файлов (этап 1 из 3).
Проверка файлов завершена.
Проверка индексов (этап 2 из 3).
Проверка индексов завершена.
Восстановление потерянных файлов.
Проверка дескрипторов безопасности (этап 3 из 3).
Проверка дескрипторов безопасности завершена.
В рисунке основной таблицы файлов обнаружено свободное место,
помеченное как выделенное.
В рисунке тома обнаружено свободное место, помеченное как выделенное.
Windows найдены ошибки файловой системы.
Запустите CHKDSK с параметром /F (fix) для их исправления.

Запускаю с параметром f. Требует перезагрузки — перезагружаюсь. После того, как при загрузки ОС проходит проверка, перезагружаюсь в ОС. Проверяю снова: то же самое. Обять тот же лог. И так до бесконечности можно.
Файловая Система : НТФС.
Что делал:
1. Проверил МШДД — диск в порядке, бедов НЕТ.
2. Патишек мэйджик — ошибок не обнаруженно.
3. Нортон Диск Доктор — ошибок не обноруженно.

Самое странное еще: что 1 раз проверишь — ошибка есть, сразу еще раз — нет.

Что это может быть и как можно выличить?

1. Akina , 05.09.2006 15:50
Загрузись в консоль восстановления и сделай проверку оттуда.
2. SergDubna , 05.09.2006 16:08
А как проверить: chkdsk c:/f ?
Еще странность в том, что при проверке при загрузке — ни чего не находится. В смысле нет «В рисунке тома обнаружено свободное место, помеченное как выделенное». А из под Винды ругается.
3. Tomset , 05.09.2006 16:37
SergDubna
Что это может быть и как можно выличить?
Это скорее всего последствия неправильной разбивки на разделы Партишен Меджиком.
Нарушает он общепринятые стандарты при разбивке на разделы.
Слить все ценые данные, перерабить разделы стандартными средствами Win. Вернуть данные.
И стереть навсегда ПМ.
Либо оставить все как есть. Отключить авто старт Chkdsk. И ждать, когда какая-нибудь утилита работы с диском, добьет данные.
4. SergDubna , 05.09.2006 17:14
Автостарта CHKDSK у меня нет. эту ошибку вообще не видно. Просто раздражает сам факт, что такое пишется при тесте.
5. Antech , 05.09.2006 17:24
SergDubna
Диск системный? В таком случае это из-за постоянного изменения файловой системы вследствие активности ОС и программ. Поэтому сообщение появляется не при кажлдой проверке, и не появляется при загрузке: в этот момент работает только сам Чекдиск, и файловая система не подвержена изменениям со стороны других прог и ОС.
У меня такое тоже было на системных дисках, не думаю что там были проблемы с ФС: СМАРТы винтов были в порядке + была только что установлена Винда.
6. SergDubna , 05.09.2006 17:47
Т.е. это все нормально? Например у вас сейчас на машине есть такая трабла?
7. Antech , 06.09.2006 09:34
SergDubna
Например у вас сейчас на машине есть такая трабла?
Вот результаты последовательных тестов для двух логических разделов SP2514N (раздел C системный WinXP SP2, раздел D для данных).

цитата (chkdsk.exe C: (тест 1)): В рисунке основной таблицы файлов обнаружено свободное место,
помеченное как выделенное.
Исправление ошибок в рисунке тома.
Windows найдены ошибки файловой системы.
Запустите CHKDSK с параметром /F (fix) для их исправления.

цитата (chkdsk.exe C: (тест 2)): Исправление ошибок в рисунке тома.
Windows найдены ошибки файловой системы.
Запустите CHKDSK с параметром /F (fix) для их исправления.

цитата (chkdsk.exe C: (тест 3)): Исправление ошибок в рисунке тома.
Windows найдены ошибки файловой системы.
Запустите CHKDSK с параметром /F (fix) для их исправления.

цитата (chkdsk.exe D: (тест 1)): [Сообщений об ошибках нет]

цитата (chkdsk.exe D: (тест 2)): [Сообщений об ошибках нет]

Как видите, на разделе D: ошибок не находится в обоих тестах.
На разделе C: в первый раз было конкретно сказано про «свободное место, помеченное как выделенное». В двух последующих тестах таких сообщений не было, просто «исправление ошибок в рисунке тома» (ну, блин, переводчики, bitmap тут переводится как «карта», а не как «рисунок») . Так что, вывода два:
1. Эти сообщения появляются на системном разделе.
2. Сообщения меняются от теста к тесту.
Это может быть связано с тем, что chkdsk.exe читает FS непосредственно с винта, минуя буфер ОС. А т. к. ОС постоянно обновляет ФС, то текущее состояние ФС на винте (в отличие от буфера ОС) может быть некорректно. ИМХО.

Насколько я помню, когда впервые столкнулся с проблемой, я пометил раздел как «dirty» и перезагрузился — Чекдиск во время загрузки ОС не нашел проблем. Сейчас лень перегружаться.


8. Tomset , 06.09.2006 15:16
SergDubna
http://support.microsoft.com/kb/315688/ru

цитата:
Распределение дискового пространства тома NTFS может быть неправильно определено по одной из следующих причин:
• Размер кластера тома NTFS слишком велик для среднего размера хранящихся файлов.
• Атрибуты файлов или разрешения NTFS препятствуют отображению файлов и папок или доступу к ним при использовании проводника Microsoft Windows или командной строки Windows.
• Путь к папке превышает 255 знаков.
• Папки или файлы имеют неправильные или зарезервированные имена.
• Метафайлы NTFS (такие как основная таблица файлов [MFT]) увеличились в объеме и не могут быть освобождены.
• Файлы или папки содержат альтернативные потоки данных.
• Повреждение NTFS является причиной определения свободного пространства как используемого в Windows.
• Другие возможности NTFS являются причиной неправильного выделения пространства под файлы.

особенно последний пункт умиляет.

9. Биочеловек , 04.11.2010 04:15
Windows XP SP2
Кто-то нашел лечение этой проблемы?
При обновлении она пройдет.
10. Antech , 04.11.2010 23:00
Биочеловек
Я ведь показывал выше результаты экспериментов. Это не проблема и лечить ее не надо. Кстати, Чекдиск от Win7 прямо предупреждает, что раздел не размонтирован (системный) и могут быть «сообщения об ошибках при их отсутствии».
11. Биочеловек , 05.11.2010 14:46
У меня показывают такие ошибки не на системных разделах. Разделы D и K соответсвенно. Их и проверял.

Когда загрузился с флешки и проверяю все нормально.
А только загрузил Windows XP — то проверяю есть ошибки. То есть под Windows XP всегда ошибки с дисками D и К. При чем отключай, не отключай разделы все-равно есть ошибки.

Загружаюсь с системного диска, с флешки и проверяю — ошибок нет (прверял chkdsk Vindows 7)
Когда проверяю chkdsk (XP) то выдает ошибку Исправление ошибок в файле преобразования к верхнему регистру.

Снова загружаю Windows XP chkdsk с параметром /f он отмонтирует диск K и сообщение ошибок не обнаружено не выведет. Запускаю снова — и вот он выводит, что ошибок не обнаружено.

Но проходит время и chkdsk снова молчит и не показывает, что ошибок не обнаружено.

Загружаюсь с флешки и проверяю и получаю, что ошибок не обнаружено.

В чем дело, объясните?

12. lvqcl , 05.11.2010 14:56
Биочеловек
В чем дело, объясните?

Antech
Это может быть связано с тем, что chkdsk.exe читает FS непосредственно с винта, минуя буфер ОС. А т. к. ОС постоянно обновляет ФС, то текущее состояние ФС на винте (в отличие от буфера ОС) может быть некорректно. ИМХО.

13. Биочеловек , 05.11.2010 15:33
Ну вот загрузился с флешки и проверял разделы NTFS.
Chkdsk от Windows 7 говорит, что все ОК — и проверяет быстрее.

Так вот я зашел в папку с Windows XP на системном диске (FAT32) и запусти chkdsk с параметром вначале D:, а потом E:. И получил сообщение Исправление ошибок в файле преобразования к верхнему регистру.
Почему chkdsk от Windows 7 показывает, что все ОК, а chkdsk от Windows XP показывает это сообщение? Я загрузился с флешки, загрузочная флешка Windows 7.

Добавление от 05.11.2010 16:34:

Подскажите в чем дело?

Добавление от 05.11.2010 18:53:

Дело в кешировании или в неполадках железа?

Компьютер работает в режиме 24/7.
Блок питания FSP Group 350PNF. Можно конечно поставить Chieftek 420Wt но компьютер при запуске игр и при сильной загрузке не показывает ничего странного, работает стабильно.

Помогите, пожалуста!

14. Antech , 06.11.2010 22:51
lvqcl
Не, тут другой случай: разделы размонтируются, да и $UpCase. Вроде он не переписывается, хотя ХЗ, странно все это.

Биочеловек
Надо было уточнить. Ранее рассматривалось только относительно $Bitmap на системном разделе, а не в сочетании с $UpCase и на несистемных разделах. Т.к. телепатов тут нет, то кто же догадается, что у Вас другая проблема?

Проверьте память в memtest86, проверьте SMART винта. В журнале Винды ничего подозрительного нет?

15. Биочеловек , 07.11.2010 13:43
Ошибки появлялись на разделе K и D (находятся на разных дисках)

Смарт раздела K (114Gb) во вложении.
Сканировал диск программой Victoria под DOS:
Victoria 3.52 HDD Test
1. 5JT4S84J — 3 remapa
5 ms — 654548
20 ms — 253271
50 ms — 7948
200 ms — 21
Диск не в идеальном состоянии.

Memtes86 пока систему не проверял.

Я сделал следующее:
1. Переустановил драйвера для материнской платы Albatron KX400-8XV(v2.0)
ViaHyperion и USB2.0 ftp://ftp.albatron.com.tw/FAE/Mainboard/KX400_Series/KX400-8XV(v2.0)/
2. Удалил Perfect Disk 7.0
3. Установил Perfect Disk 11 (2010) и дефрагментировал MFT разделов D и К. Диск D SmartplacementDefrag.
4. Удалил Perfect Disk 11 и установил 7.0. Проверял Update используется самый последний билд 46. Дефрагментировал системный диск C (FAT32) — Offline и Smartplacement.

Торрент работает, программы в автозагрузке:
Hostmon, Dumeter, utorrent, motherboard monitor, vmware — службы, kiwi syslog daemon, winlirc, infra red executer, riva tuner, cdslow.

Проверял после каждого шага винчестер chkdsk — ошибок нет.

Несколько раз проводилось изменение конфигурации компьютера, а система не переставлялась (Windows XP SP2).

С дефрагментацией закончил буду временами проверять диски D и К chkdsk-ом.

В данный момент ошибок нет. Но, кто знает может они появяться?

К сообщению приложены файлы: 1.gif, 765×703, 76Кb

16. Ahai , 07.11.2010 16:16
Биочеловек
Установил Perfect Disk

А этот еще зачем?
Эти сторонние деграгментаторы иногда источники нехилых проблем.
Он там часом в background-е не висит резидентно и не дефрагментирует в фоне?

17. Биочеловек , 07.11.2010 17:01
Удалось локализовать проблему.
Microsoft Train Simulator. Запускаешь TrainStore выбираешь сценарий а затем запускаешь. Потом выходишь. И вот chkdsk показывает некорректность с файловой системой. Приходится запускать с ключом /f и исправлять.

Но провел эксперимент.
Проверил диск — chkdsk — ошибок не обнаружено
Запустил MSTS
Проверил — ошибки найдены.
Перезагрузил компьютер — ошибки найдены.
Запустил MSTS в TrainStore выбрал Unstore Everything! подождал и вышел
Проверил chkdsk — ошибок на диске не обнаружено.
Повторил этот эксперимент без перезагрузки компьютера. Ситуация повторилась.
Какие можно сделать выводы. Знатоки MSTS отзовитесь.

Так вот при запуске MSTS Train Store, выборе и запуске сценария происходит, как я понял, перемещение сотни файлов — подготовка окружения для запуска игры MSTS. При выходе если эти файлы не отмонтировать Unstore Everything! — то будут ошибки.
Причем если вышел и файлы не отмонтированы то это можно сделать позже. Ошибки на диске пропадают — Windows ошибок на диске не обнаружено. Искал в google почему-то об этом никто не написал.

правильное использование проверки на ошибки (включая ferror), когда освобожденное использование и fwrite

Я пишу программу C, которая делает это: — читает от файла в блоках (во множество) — выполните модификации на данных во множестве — тогда напишите данные массива в недавно созданный файл

Обрабатывающий файл код петли идет как это:

Если-условие для излишества проверки на ошибки?


Достаточно использовать ferror как это? если (bytes_written! = bytes_read) называют ferror здесь, чтобы выяснить то, что пошло не так, как надо />?

Что лучший способ состоит в том, чтобы использовать ferror и другие механизмы проверки на ошибки в этом виде сценария?

Функции обработки ошибок

Читайте также:

  1. B) Функции
  2. I. Сущность, функции и типология полит.партий
  3. V. Карточка обработки хронорядов показателей
  4. V. Карточка обработки хронорядов показателей
  5. V. Карточка обработки хронорядов показателей 1 страница
  6. V. Карточка обработки хронорядов показателей 2 страница
  7. VII. Упрощенный метод обработки результатов прямых измерений с использованием средней абсолютной погрешности.
  8. АВТОМАТИЧЕСКИЕ И КОНТРОЛИРУЕМЫЕ ПРОЦЕССЫ ОБРАБОТКИ ИНФОРМАЦИИ
  9. Автоматическое исправление орфографических ошибок при вводе данных
  10. Агрегатные функции
  11. Алгебраические функции и их вычисление
  12. Анализ комплекса средств автоматизации обработки информации как объекта защиты

Функции вывода

Int fflush(FILE *file) —служит для выталкивания каждого внутреннего бу­­фера на соответствующее устройство. После вызова функции файл остается открытым. Если при выполнении функции появятся ошибки, то будет возвращено значение EOF, иначе — 0.

Int fputc(char ch, FILE *file) — символ ch записывается в указанный выход­ной файл. Если запись прошла успешно, то возвращается значение ch.

int putchar(char ch) —действует аналогично функции fputc, но записывает символ ch в стандартный выходной файл stdout.

Int fputs(char *s, FILE *file) —строка s, ограниченная ноль-символом, переписывается в выходной файл, причем ноль-символ отбрасывается. Если при переписи возникает ошибка, то возвращается значе­ние EOF, в противном случае возвращается ненулевое зна­чение.

Int puts(char *s) —функция аналогична функции fputs, за исключением того, что символы переписываются в стандартный файл stdout, и строка s дополняется ноль‑символом конца строки.

Int fwrite(void *ptr, unsigned elem_size,Int count,FILE ) —начиная с адреса ptr, считывается не более чем количество count элементов размером elem_size байтов каждый, и эти элементы записываются в вы­ход­ной файл. Функция возвращает число фактически записанных элементов.

Int fprintf(FILE *stream,char *format, );

Int printf(char *format , );

Int sprintf(char *s, char *foramt, );

Int cprintf(char *format, );

С помощью этих функций выполняется форматный вывод соот­ветственно в: выход­ной файл (fprintf), в стандартный выходной файл stdout (fprintf), ука­зан­ную строку (sprintf) или на терминал (cprintf). Функции возвращают число символов, переданных по назначе­нию.

Строка формата (char *format) задает редактирование данных (п. 6.2.5).

Int ferror(FILE *file) —возвращает нулевое значение, если последняя операция ввода/вывода с указанным файлом закончилась успешно, иначе ‑ нену­ле­вое значение.

void clearerr(FILE *file) —устанавливается в нуль состояние признака ошибки в указанном файле.

Пример программы создания справочника товара spravtov.txt

int main(int argc, char **argv) // основная функция

FILE *nf; // объявление файловой переменной nf*

if (( nf=fopen(«spravtov.txt»,»w»))==0) // проверка открытия spravtov.txt

printf(«\n Название товара?»); scanf(«%s»,&zstovar.nt); // ввод fseek(nf,(zstovar.kt-1)*sizeof(zstovar),0);// установка на запись с номером=kt

fwrite(&zstovar,sizeof(zstovar),1,nf); // вывод записи zstovar в файл spravtov

> /* конец тела цикла */ fclose(nf); // закрытие файла spravtov.txt

> // конец тела основной функции

6.5.2. Файлы в С++

При работе с файлами (#include ) используются поточные клас­сы ifstream(чте­ние), ofstream(запись), fstream(чтение и запись). Описание потоков приводится в файле Cbuilder5\Help\IOS&CR.DOC.

Перед открытием файла следует создать поточный объект в виде: . В консольных при­ло­жениях поточные объекты под именами coutи cinзадают стандартный вы­вод на экран и ввод с клавиатуры и не требуют сво­его создания, откры­тия и закрытия и могут быть переопределены в коман­д­ной строке на файлы. Открытие файла выполняется отдельно методом open( , ) или сразу при создании поточного объекта (ofstream file(«Tovari.txt»);).

Режимы задаются в виде: ios:: |ios:: | ios:: .

Перечислим основные режимы: in (ввод), out (вывод), binary (бинарный файл), app (дозапись в конец файла), ate (установить указатель в конец файла), trunc (очистка файла).

Пример открытия файла на запись и его закрытия:

ofstream file; file.open(«Tovari.txt», ios::out|ios::app); file.close();

Операторы включения ( >) записывают и чи­тают данные из файла. Опера­тор извлечения останавливается на первом символе-разделителе (сим­волы про­бела, табуляции и новой строки). Таким образом нельзя ввести зна­че­ние из нескольких слов в отличие от мето­да getline. В данных опе­раторах можно использовать модификаторы для форматирования дан­ных (#include ): endl/ends(вставка символа новой/конца строки), dec/hex/oct(перевод в десятич­ное/шес­т­над­цати­рич­ное/вось­меричное чис­ло), ws (извлечение про­белов), flush(очистка ost­ream), setfill(‘ ’) (установка символа заполните­ля), setprecision(n) (точ­ность вещественных чисел в n разрядов), setw(n) (ши­рина поля n).

Основные методы класса ofstream: open(открытие), put(запись сим­вола), write(запись заданного числа символов), seekp(установка ука­за­те­ля на нужный байт), tellp(возвращает значение указателя), close(за­кры­тие). Основные методы класса ifstream: open(открытие), get(чтение), getline(чтение строки), read(чтение заданного числа байтов), eof(true, достигнут конец файла), peek(выдает очередной символ, но не выбирает его), seekg(установка указателя на нужный байт), tellg(возвращает значение указателя), close(закрытие).

Пример создания текстового файла «Tovari.txt»:

int main(int argc, char **argv) <

ofstream file («Tovari.txt»); //создание объекта file и открытие файла

file >kod>>cena>>ws;//чтение в переменные kod и cena, пропуск пробелов

cout > zstovar.kt; // ввод код товара в kt

if (zstovar.kt 10) break; // выход из цикла ввода

cout > zstovar.nt; // ввод наименования товара


file.write((char*)&zstovar,sizeof(zstovar)); // вывод записи zstovar в spravtov

> /* конец тела цикла */ file.close(); // закрытие файла spravtov.txt

ifstream infile(«spravtov.txt»,ios::binary); // открытие файла для чтения

while(!infile.read((char*)&zstovar,sizeof(zstovar)).eof())//цикл чтения записей

cout = newTFileStream( , );

Режимы открытия файла: FmCreate(создание файла; если он уже су­щест­вует, то открыть его для записи), fmOpen­Read(открыть файл для чтения), fmOpenWrite(открыть файл для записи с полной заменой теку­ще­го содер­жа­ния), fmShareExclusive/fmShareDeny­No­ne(монопольное/кол­лек­тив­ное ис­поль­зование файла), fmShareDenyWrite/fmShareDenyRead(ко­л­­­лективное использование фай­ла по чтению/записи).

Пример. Разместим на форме кнопку Button1 и объект Memo1. Сос­тавим процедуру обработки события Click для этой кнопки:

void __fastcall TForm1::Button1Click(TObject *Sender) // процедура

<struct stovar zstovar; // объявление переменной-записи

char str[30]; // создадим далее объект file и откроем создаваемый файл

TFileStream* file = new TFileStream(«spravtov.txt»,fmCreate); // открытие

stovar zst1=<1, «масло крестьянское»>; // значения полей первой записи zst1

stovar zst2=<2, «масло подсолнечное»>;// значения полей второй записи zst2

file->Position=(zst1.kt-1)*sizeof(zst1); // установка на запись под номером kt

file->Write(&zst1,sizeof(zst1));//вывод записи zst1 под номером kt в spravtov

file->Position=(zst2.kt-1)*sizeof(zst2); // установка на запись под номером kt

file->Write(&zst2,sizeof(zst2));//вывод записи zst2 под номером kt в spravtov

delete file; // удаление объекта file c закрытием файла spravtov.txt

//создание объекта infile и открытие файла spravtov.txt для чтения

TFileStream* infile = new TFileStream(«spravtov.txt»,fmOpenRead);

Memo1->Clear(); // очистка объекта Memo1

while(infile->Read(&zstovar,sizeof(zstovar))>0) // цикл чтения записей

Memo1->Lines->Add(str); // добавление строки str в массив строк Memo1

>delete infile; /*удаление объекта infile c закрытием файла spravtov.txt*/ >

6.6. Объектно‑ориентированное программирование

Дата добавления: 2014-12-08 ; Просмотров: 230 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Правильное использование проверки ошибок (вкл. FERROR) при использовании Fread и FWRITE

Я пишу программу, C, что делает это: — считывает данные из файла в блоках (в массив) — выполнять изменения на данных в массиве — затем записать данные массива в недавно созданный файл

Код цикла обработки файлов выглядит следующим образом:

Является ли условие, если-для проверки ошибок излишних?

Достаточно ли использовать FERROR , как это? если (bytes_written! = bytes_read) позвонить FERROR здесь , чтобы выяснить , что пошло не так />?

Что такое лучший способ использовать FERROR и другие механизмы проверки ошибок в таком сценарии?

Достаточно использовать FERROR как Вы заявляете в нижней части вашего вопроса:

Как исправить ошибку Cyclic Redundancy Check Error.

в Ошибки ПК 6,881 Просмотров

Когда данные передаются на ПК, CRC гарантирует, что данные, с многочисленными ошибками, не доберутся до указанного места назначения. Вот почему поврежденный компакт-диск не копируются на ваш компьютер.

Фиксация ошибок CRC

Проблемы с внешними носителями CD/DVD
Много раз, скопление грязи на CD-или DVD-вызывает CRC error. Уборка этого носителя с помощью мягкой ткани часто решает проблему. Поцарапанный компакт-диск или бумажная этикетка на диске также могут быть проблемой. Это потому, что царапины или надписи не позволяют записать правильно данные на диск. Частично записанный диски, особенно ответственен за появление этой ошибки. Для извлечения информации с поврежденных дисков, существуют программные приложения очень полезные в этом отношении. Эти инструменты восстановления данных, такие как Lost digital images с поврежденных CD и DVD дисков.

Проблемы с оборудованием
Если CRC ошибка продолжает отображаться даже после запуска очистки диска, то скорее всего проблема с оборудованием. Вам необходимо проверить очистку CD и DVD дисков и чистить их регулярно. Выяснить, действительно ли эти устройства функционируют правильно. Замена CD/DVD reader на новый может решить эту проблему.

С программным обеспечением

Неполная загрузка
Крах системы
Багги программного обеспечения (приложения с большим количеством ошибок)

В таких случаях, система может отображать сообщения вроде » недопустимый файл Windows » или » недопустимое приложение win32′. Но это на самом деле ошибка CRC.

Неполная загрузка
Файл, который был не правильно загружен из Интернета или была прервана передача файлов, также может привести к ошибки CRC. Поэтому, прежде чем открыть файл, проверьте, был или нет он полностью загружен. Вы можете использовать менеджер загрузок при скачивании любого файла из интернета. Приложение Диспетчер загрузки, сохраняет трек в процессе скачивания, и сообщает вам, когда она будет завершена. Или же, вы можете снова попытаться загрузить с самого начала, и проверить, будет ли ошибка по-прежнему возникать.

7,0,1,0,0

Потеря соединения
Дефектные соединения между компьютером и жестким диском вызывают CRC сообщения, всплывающие на экране. Для фиксации CRC-ошибки, связанной с проблемами в работе сети, необходимо проверить все соединения, чтобы декодировать проблему. Иногда, подключение DVD/CD-дисков отсоединяется, и могут повлиять на функционирование устройства.

Проблемы с жестким диском
Во многих случаях CRC сообщение отображается на экране, когда на диске назначения (жесткий диск) есть плохие сектора. Так что, хотя DVD/CD-это совершенно нормально, но по-прежнему может возникнуть эта ошибка. Это происходит потому, что расположение (жесткий диск), где вы пытаетесь сохранить файл есть плохие сектора. Проверить есть ли плохие сектора, выполнив NUL команды запустив командную строку. Фактически эта команда считывает содержимое файла, сохраненных на CD/DVD. Например, если DVD-диск на компьютер Е, и файл nicks.txt в DVD хранится в папке tng\audio, то командная строка будет выглядеть следующим образом:

E:\tng\audio>xcopy nicks.txt NUL

Потому что назначения не указано, оно только читает файл. Если команда выполнена успешно, вы получите результат как 1 file(s) copied, т.е. файл прочитан успешно, и, как таковой, нет проблемы с ним. Это означает, что жесткий диск поврежден из-за плохого сектора. В таком случае, решением является либо поменять жесткий диск или записать DVD на другой машине в целом.

14,1,0,0,0

Ремонт жесткого диска
Если вы думаете о ремонте жесткого диска, можно запустить восстановленную программу для проверки жесткого диска, такую как SpinRite. Эта программа делает две вещи. Во-первых, она извлекает данные из плохого сектора. Во-вторых, она помечает все плохие сектора, для того, что бы данные никогда не были больше записаны на них в будущем. Другой вариант, чтобы удалить ошибки с жесткого диска, выполнить команду CHKDSK. Это проверка диска командой, которая определяет поврежденные сектора и пытается восстановить читаемую информации.

Запуск CHKDSK из графического интерфейса пользователя (GUI)
Дважды щелкните на рабочем столе значок Мой компьютер. Выберите раздел жесткого диска, который вы хотите проверить. Как мы все знаем, буквы часто используются, чтобы дать название разделам диска. В зависимости от размера вашего жесткого диска, он будет иметь два или более разделов. Поэтому, если ваш жесткий диск имеет 4 секции, вы должны запустить команду CHKDSK для каждой секции сканирования всего жесткого диска.

Илон Маск рекомендует:  Что такое код dbplus_close
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL