файл всегда будет пустой в двух случаях: 1) переменная i не изменяется. В этом случае цикл while ( s[i] != '\0' ) превращается в while ( s[0] != '\0' ) и бесконечно крутится, до записи в файл никогда не дойдёт. 2) переменная i изменяется но строка не терминирована нулём (такие тоже есть), в этом случае цикл опять бесконечен, но при этом ещё и имеет место быть вылет за границы массива. До записи в файл опять никогда не дойдёт.
В общем, в этом примере есть явная ошибка - отсутствие i++, плюс имеется допущение, что строка всегда нуль-терминированная - значит, массив содержит хотя бы null, что делает корректным обращение к элементу с индексом 0, и гарантирует выход из цикла. Если строка не нуль-терминированная, то аж две возможности словить бяку: обращение к пустому массиву и бесконечность цикла.
Если в книжке подобное не описано - плохая книжка. Если описано - хорошая, а i++ просто ошибка, забыл он или наборщик-редактор-корректор... у меня на каждую сотню строк кода одна такая глупая ошибка находится
Последний раз редактировалось Martian Пн авг 19, 2024 17:18:47, всего редактировалось 1 раз.
Ну уж точно не я. По крайней мере в этом. Это действительно зависает при выполнении. выполняется бесконечный цикл?
Код:
main() { char s[80]; int i; FILE *fin, *fout; fin = fopen ( "input.dat", "r" ); fout = fopen ( "output.dat", "w" ); [color=#FF8040]while ( NULL != fgets ( s, 80, fin ) ) // читаем строку [/color] { i = 0; // начинаем с s[0] while ( s[i] != '\0' ) // пока не конец строки if ( s[i] == 'A' ) s[i] = 'Б'; // меняем символ i++ ; fprintf ( fout, "%s", s ); // выводим строку в файл } fclose ( fin ); fclose ( fout ); }
Причём зависает на девятой красной строке. Ставишь вместо не равно равно,тогда проходит. Значит не читает программка из моего файла input.dat ничего. Хотя лежат они все три в одной папке. И соответственно ничего не записывает в выходной. Как был пустым,так и остаётся.
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
ну, надо знать, что за файл input.dat, может, там что-то юникодное. Может файл вообще не открывает, Вы же это не проверили. Теоретически, надо так:
Код:
main() { char s[80]; int i; FILE *fin, *fout;
if (fin = fopen("input.dat", "r") != NULL) // если файл для чтения открылся успешно { if (fout = fopen ("output.dat", "w") != NULL) // если файл для записи открылся успешно { while (fgets(s, sizeof(s), fin) != NULL) // читаем строку { //....здесь делаем операции со строками } fclose (fout); } else { printf ("Не могу открыть файл output.dat!\n"); } fclose (fin); } else { printf ("Не могу открыть файл input.dat!\n"); } printf ("Программа завершена\n"); } //main
Попробуйте запустить этот код без обработки строк и записи их. Вот как он есть. Если получите сообщение "Программа завершена" без иных сообщений, значит файлы открываются корректно, чтение входного файла тоже.
Добавлено after 18 minutes 16 seconds: Можно немного удобнее записать тот же алгоритм действий, чтобы не размазывать ветвления по всему тексту:
Код:
int main() { char s[80]; int i; FILE *fin, *fout;
if (fin = fopen("input.dat", "r") == NULL) // если файл для чтения не открылся { printf ("Не могу открыть файл input.dat!\n"); return 1; // прекращаем работу программы }
if (fout = fopen ("output.dat", "w") == NULL) // если файл для записи не открылся { printf ("Не могу открыть файл output.dat!\n"); return 1; // прекращаем работу программы }
while (fgets(s, sizeof(s), fin) != NULL) // читаем строку { //....здесь делаем операции со строками } fclose (fout); fclose (fin); printf ("Программа завершена\n"); return 0; } //main
В общем, следует помнить, что функции обычно всегда возвращают результат своей деятельности, и проверять его - это хорошо. Хотя и запарно иногда...
Файлы разные бывают. И совсем не обязательно символьная строка терминальным нулем закрывается. Тот же Intel hex8 к примеру... Да и использовать для тестов - тренировок нужно латиницу - ее все программы понимают без некорректностей. С кириллицей и ОС и редактор текста "подкузьмить" могут.
ОС и редактор уже много лет как могут использовать UTF-8/16, и это должно быть настроено прям сразу после установки. Все древние неюникодные кодировки - анахронизм или узкоспециализированное.
Да и использовать для тестов - тренировок нужно латиницу - ее все программы понимают без некорректностей.
Martian писал(а):
С и редактор уже много лет как могут использовать UTF-8/16, и это должно быть настроено прям сразу после установки. Все древние неюникодные кодировки - анахронизм или узкоспециализированное.
Только не у меня. У меня всё древнее,WinXP и пр. , и мой DevC кириллицу пишет кракозябрами, в том числе и в комментариях.
Один (самый древний) я таки разобрал и к адуринке прицепил... https://img.radiokot.ru/files/20529/3jhnuqkts1.jpg Теперь второй вопрос... Питание у самоделки в диапазоне от 5 до 3.0 вольта (обычный самоделка на аккумуляторе)... Обычное регулирование контраста переменным резистором работает только при фиксированном напряжении питания. Подкручивать явно не великое удовольствие. А вот как и что удерживать на Vo стабильным автоматически,чтобы контраст оставался неизменным во всем диапазоне питающих напряжений? Напряжение или ток?... И относительно чего - GND или + питания? Видел варианты что на DSках (экзотика с программируемым потенциометром), что с источником тока на LM334... А вот что есть истина?
Поверьте, лучше полета в лучах заката им применения не найти!
Все вещи, детали, предметы и т.п., которым не нашлось применения за предыдущие годы, надо выкинуть, и не ломать голову. Я недавно выкинул примерно с килограмм советских транзисторов... Еще раньше мешок 155й серии. Еще раньше полноразмерный картофельный мешок резисторов МЛТ... Сейчас готовлюсь выкинуть около сотни транзисторов "в металле"... Всем этим запасам лучшее место на свалке.
Добавлено after 2 minutes 40 seconds: Вот единственное, о чем жалею, так это об отданных "во дворец пионеров" куче ГРИ... В ту пору АЛ307 казался невероятно крутым, а теперь... Эх...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
"... 32-разрядный 8051 Cortex MCU серии 32G Сверхвысокая скорость 32-разрядного ядра 8051 с одной тактовой частотой за машинный цикл, которая называется 1T и скорость примерно в 70 раз выше, чем у традиционного 8051. ..." ( https://www.stcmicro.com/stc/stc32g.html https://www.stcmicro.com/stc/stc32g12k128.html ) ГЫММ... Так Cortex MCU или 8051 ??? и доки на китайском...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения