|
Программирование >> Перегруженные имена функций и идентификаторы
Почему фрагмент программы while(!feof(infp)) { fgets(buf, MAXLINE, infp); fputs(buf, outfp); дважды копирует последнюю строку? Это вам не Паскаль. Символ EOF появляется только после попытки прочесть, когда функция ввода натыкается на конец файла. Чаще всего необходимо просто проверять значение, возвращаемое функцией ввода, (в нашем случае fgets); в использовании feof() обычно вообще нет необходимости. Почему все против использования gets()? Потому что нет возможности предотвратить переполнение буфера, куда читаются данные, ведь функции gets() нельзя сообщить его размер. Почему переменной errno присваивается значение ENOTTY после вызова printf()? Многие реализации стандартной библиотеки ввода/вывода несколько изменяют свое поведение, если стандартное устройство вывода - терминал. Чтобы определить тип устройства, выполняется операция, которая оканчивается неудачно (c сообщением ENOTTY), если устройство вывода - не терминал. Хотя вывод завершается успешно, errno все же содержит ENOTTY. Запросы моей программы, а также промежуточные результаты не всегда отображаются на экране, особенно когда моя программа передает данные по каналу (pipe) другой программе Лучше всего явно использовать fflush(stdout), когда непременно нужно видеть то, что выдает программа. Несколько механизмов пытаются в нужное время осуществить fflush, но, похоже, все это правильно работает в том случае, когда stdout - это терминал. При чтении с клавиатуры функцией scanf возникает чувство, что программа зависает, пока я перевожу строку Функция scanf была задумана для ввода в свободном формате, необходимость в котором возникает редко при чтении с клавиатуры. Что же касается ответа на вопрос, то символ \n в форматной строке вовсе не означает, что scanf будет ждать перевода строки. Это значит, что scanf будет читать и отбрасывать все встретившиеся подряд пробельные литеры (т.е. символы пробела, табуляции, новой строки, возврата каретки, вертикальной табуляции и новой страницы). Похожее затруднение случается, когда scanf застревает , получив неожиданно для себя нечисловые данные. Из-за подобных проблем часто лучше читать всю строку с помощью fgets, а затем использовать sscanf или другие функции, работающие со строками, чтобы интерпретировать введенную строку по частям. Если используется sscanf, не забудьте проверить возвращаемое значение для уверенности в том, что число прочитанных переменных равно ожидаемому. Я пытаюсь обновить содержимое файла, для чего использую fopen в режиме r+ , далее читаю строку, затем пишу модифицированную строку в файл, но у меня ничего не получается Непременно вызовите fseek перед записью в файл. Это делается для возврата к началу строки, которую вы хотите переписать; кроме того, всегда необходимо вызвать fseek или fflush между чтением и записью при чтении/записи в режимах + . Помните также, что литеры можно заменить лишь точно таким же числом литер. Как мне отменить ожидаемый ввод, так, чтобы данные, введенные пользователем, не читались при следующем запросе? Поможет ли здесь fflush(stdin)? fflush определена только для вывода. Поскольку определение flush ( смывать ) означает завершение записи символов из буфера (а не отбрасывание их), непрочитанные при вводе символы не будут уничтожены с помощью fflush. Не существует стандартного способа игнорировать символы, еще не прочитанные из входного буфера stdio. Не видно также, как это вообще можно сделать, поскольку непрочитанные символы могут накапливаться в других, зависящих от операционной системы, буферах. Как перенаправить stdin или stdout в файл? Используйте freopen. Если я использовал freopen, то как вернуться назад к stdout (stdin)? Если необходимо переключаться между stdin (stdout) и файлом, наилучшее универсальное решение - не спешить использовать freopen. Попробуйте использовать указатель на файл, которому можно по желанию присвоить то или иное значение, оставляя значение stdout (stdin) нетронутым. Как восстановить имя файла по указателю на открытый файл? Это проблема, вообще говоря, неразрешима. В случае операционной системы UNIX, например, потребуется поиск по всему диску (который, возможно, потребует специального разрешения), и этот поиск окончится неудачно, если указатель на файл б1л каналом (pipe) или б1л связан с удаленным файлом. Кроме того, обманчивый ответ будет получен для файла со множественными связями. Лучше всего самому запоминать имена при открытии файлов (возможно, используя специальные функции, вызываемые до и после fopen). Почему strncpy не всегда завершает строку-результат символом \0? strncpy была задумана для обработки теперь уже устаревших структур данных - строк фиксированной длины, не обязательно завершающихся символом \0. И, надо сказать, strncpy не совсем удобно использовать в других случаях, поскольку часто придется добавлять символ \0 вручную. Я пытаюсь сортировать массив строк с помощью qsort, используя для сравнения strcmp, но у меня ничего не получается Когда вы говорите о массиве строк , то, видимо, имеете в виду массив указателей на char . Аргументы функции сравнения, работающей в паре с qsort - это указатели на сравниваемые объекты, в данном случае - указатели на указатели на char. (Конечно, strcmp работает просто с указателями на char). Аргументы процедуры сравнения описаны как обобщенные указатели const void * ии char *. Они должны быть превращены в то, что они представляют на самом деле, т.е. (char **) и дальше нужно раскрыть ссылку с помощью *; тогда strcmp получит именно то, что нужно для сравнения. Напишите функцию сравнения примерно так: int pstrcmp(p1, p2) /* сравнить строки, используя указатели char *p1, *p2; /* const void * для ANSI C */ { return strcmp(*(char **)p1, *(char **)p2);
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |