Ошибка конца файла вы уже считали все строки из входных данных а пытаетесь считать еще

Обновлено: 28.06.2024

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

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

В столбик 1
На вход программе подается одна строка. Напишите программу, которая выводит элементы строки с индексами 0, 2, 4, . в столбик.
Формат входных данных
На вход программе подается одна строка.
Формат выходных данных
Программа должна вывести элементы строки с индексами 0, 2, 4, . , каждое на отдельной строке.

В столбик 2
На вход программе подается одна строка. Напишите программу, которая выводит в столбик элементы строки в обратном порядке.
Формат входных данных
На вход программе подается одна строка.
Формат выходных данных
Программа должна вывести в столбик элементы строки в обратном порядке.

ФИО
На вход программе подаются три строки: имя, фамилия и отчество. Напишите программу, которая выводит инициалы человека.
Формат входных данных
На вход программе подаются три строки, каждая на отдельной строке.
Формат выходных данных
Программа должна вывести ФИО человека.
Примечание. Гарантируется, что имя, фамилия и отчество начинаются с заглавной буквы.

Цифра 1
На вход программе подается одна строка состоящая из цифр. Напишите программу, которая считает сумму цифр данной строки.
Формат входных данных
На вход программе подается одна строка состоящая из цифр.
Формат выходных данных
Программа должна вывести сумму цифр данной строки.

Сколько раз?
На вход программе подается одна строка. Напишите программу, которая определяет сколько раз в строке встречаются символы + и * .
Формат входных данных
На вход программе подается одна строка.
Формат выходных данных
Программа должна вывести сколько раз встречаются символы + и * в строке.

Одинаковые соседи
На вход программе подается одна строка. Напишите программу, которая определяет сколько в ней одинаковых соседних символов.
Формат входных данных
На вход программе подается одна строка.
Формат выходных данных
Программа должна вывести количество одинаковых соседних символов.

Гласные и согласные
На вход программе подается одна строка с буквами русского языка. Напишите программу, которая определяет количество гласных и согласных букв.
Формат входных данных
На вход программе подается одна строка.
Формат выходных данных
Программа должна вывести количество гласных и согласных букв.
Примечание. В русском языке 10 гласных букв (а, у, о, ы, и, э, я, ю, ё, е) и 21 согласная буква (б, в, г, д, ж, з, й, к, л, м, н, п, р, с, т, ф, х, ц, ч, ш, щ).

Decimal to Binary
На вход программе подается натуральное число, записанное в десятичной системе счисления. Напишите программу, которая переводит данное число в двоичную систему счисления.
Формат входных данных
На вход программе подается одно натуральное число.
Формат выходных данных
Программа должна вывести число записанное в двоичной системе счисления.

По ходу дела, я очень плохо понял тему указателей и работы с памятью, и теперь вот никак не могу сделать, казалось бы простейшую вещь.
Есть текстовый файл со словами, записанными по одному слову в строчку. Нужно считать каждую строку в массив arr[]. Пробовал и fscanf и fgetsе - не получается :(
Подскажите, что я не так делаю, и как правильно?

На сколько я понял вы пытаетесь прочитать строку из файла и сохранить ее как элемент массива arr.
Но делаете это не правильно.
Ваша ошибка в том, что fscanf/fgets не выделяет память для хранения строки, она использует тот буфер, который вы ей предоставите. Но вы ничего не предоставляете.
Вам нужно для каждого элемента arr выделить память под строку:
arr[i] = (char*)malloc(sizeof(char) * BUFLEN);
где BUFLEN - некоторая целочисленная константа, обозначающая максимальную длину строки.
Тогда чтение из файла, как реализовано у вас пройдет.
В конце память выделенную с помощью malloc нужно освободить с помощью вызова free для каждого элемента массива arr.
И не забывайте обрабатывать ошибки выделения памяти и возвраты файловых операций.
fscanf со спецификатором формата "%s" считывает не строку, а слово - в строке может быть много слов. Для чтения строки используйте fgets, либо читайте посимвольно fgetc.
Когда заработает, потренируйтесь на файле, содержащем строку из более чем BUFLEN символов и попытайтесь найти корректный выход из этой ситуации.

Спасибо за ответ!
Функция fscanf мне вполне подходит, т.к. в моих исходных данных все строки состоят из одного слова. С выделением памяти, я кажется разобрался. В цикле, перед тем как использовать fscanf я выделяю память для элемента массива.

Но с высвобождением - не уверен что делаю верно. Правильно ли высвобождается память в этом цикле?

В итоге программа работает, но не совсем корректно. Я вывожу на экран не пустые ячейки массива с помощью цикла:


И получаю результат:

Откуда берутся лишние три строки, и ошибка сегментации?

romajke, Проверка
if (arr[i])
в вашем случае не срабатывает.
Потому что, чтоб в arr[i] были нули (т.е. условие ложно) их нужно туда присвоить, а у вас этого нет.
Перед чтением из файла, присвойте всем значениям arr нули.
Потом, когда будете выделять память для строк значащие элементы примут значения !=0, а пустые строки так и останутся нулями и условие отработает как надо.

Все верно, это помогло. Спасибо!
Код работает корректно.
А что с памятью? Верно ли я ее высвобождаю циклом

Или нужно как то по другому?

romajke, Раз уж вы выделяете память не для всех элементов массива, то и освобождать нужно только их: добавьте перед free условие:
if(arr[i])

res2001, да. Это понятно, теперь код полностью корректно работает. Но не совсем понятна работа fscanf в данном контексте. Если я, например, не сразу считываю в элемент массива arr[], а предварительно записываю данные в созданную переменную типа char word[SIZE]:


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

Если я правильно понимаю, то элементы массива получают ссылку на word, и получают значение которое хранится по адресу переменной word. Но как это изменить - не пойму. Как передать в элемент массива именно значение word?

Я пытаюсь выполнить некоторые задачи по коду в гольф , но все они требуют ввода информации stdin . Как мне получить это в Python?

Вы можете использовать fileinput модуль:

fileinput будет проходить по всем строкам ввода, указанным в качестве имен файлов, указанных в аргументах командной строки, или стандартного ввода, если аргументы не предоставлены.

Примечание: line будет содержать завершающий перевод строки; чтобы удалить это использовать line.rstrip()

@BorislavStoilov И этот ответ правильно отвечает на вопрос: «или стандартный ввод, если аргументы не предоставлены». Документация заявляет, что это отступает от stdin: «Это перебирает строки всех файлов, перечисленных в sys.argv [1:], по умолчанию sys.stdin, если список пуст. Если имя файла равно« - », оно также заменяется by sys.stdin. Чтобы указать альтернативный список имен файлов, передайте его в качестве первого аргумента для input (). Также допускается одно имя файла. "

Есть несколько способов сделать это.

sys.stdin это файл-подобный объект, для которого вы можете вызывать функции, read или readlines если вы хотите прочитать все или вы хотите прочитать все и автоматически разделить его на новую строку. (Вам нужно, чтобы import sys это работало.)

Если вы хотите запросить ввод данных у пользователя, вы можете использовать его raw_input в Python 2.X и только input в Python 3.

Если вы на самом деле просто хотите прочитать параметры командной строки, вы можете получить к ним доступ через список sys.argv .

Вы, вероятно, найдете эту статью Wikibook о вводе / выводе в Python также полезной ссылкой.

Обратите внимание, что это будет включать символ новой строки в конце. Чтобы удалить line.rstrip() перевод строки в конце, используйте, как сказал @brittohalloran.

Используя этот метод, как мы узнаем, когда заканчивается поток ввода? Я хочу добавить запятую после каждой строки за исключением последней строки. Я получаю: TypeError: объект FileWrapper не повторяется. @avp это не будет правильно иметь дело с \r\n окончаниями строк

Python также имеет встроенные функции input() и raw_input() . Смотрите документацию по Python в разделе Встроенные функции .

Это читает одну строку, которая на самом деле не то, о чем спрашивал ОП. Я интерпретирую вопрос как «как я могу прочитать несколько строк из дескриптора открытого файла до EOF?» ОП не просит читать ввод с клавиатуры, он просит прочитать из стандартного ввода, которое обычно предоставляется участникам конкурса. это то, что мне было нужно, Google привел меня сюда. Интересно, что мне удалось закодировать теги rfid, datetime, базы данных, но я никогда не удосужился прочитать входные данные от пользователя. lol

В Unix вы можете проверить это, выполнив что-то вроде:

В Windows или DOS вы должны сделать:

Вот более эффективной памяти (и , возможно , быстрее) способ подсчета строк в Python: print(sum(chunk.count('\n') for chunk in iter(partial(sys.stdin.read, 1 << 15), ''))) . см wc-l.py Использование cat здесь является излишним. Правильный вызов для систем Unix является python countlines.py < countlines.py . «Изучение Python» неправильно в направлении пользователей использовать readlines() . Файловые объекты предназначены для итерации без материализации всех данных в памяти.

Как вы читаете со стандартного ввода в Python?

Я пытаюсь выполнить некоторые задачи кода, но все они требуют ввода от stdin. Как мне получить это в Python?

Ты можешь использовать:

    - Файловый объект - вызов, sys.stdin.read() чтобы прочитать все. - передать ему необязательный запрос на вывод, он читает от стандартного ввода до первой новой строки, которую он удаляет. Вам придется делать это несколько раз, чтобы получить больше строк, в конце ввода это вызывает EOFError. (Вероятно, не подходит для игры в гольф.) В Python 2 это так rawinput(prompt) . - В Python 3 встроенная функция open принимает файловые дескрипторы (целые числа, представляющие ресурсы ввода-вывода операционной системы), а 0 - дескриптор stdin . Он возвращает похожий на файл объект sys.stdin - вероятно, ваш лучший выбор для игры в гольф. В Python 2 это так io.open .
  • open('/dev/stdin').read() - похоже open(0) , работает на Python 2 и 3, но не на Windows (или даже Cygwin). - возвращает итератор над строками во всех файлах, перечисленных в sys.argv[1:] , или стандартный ввод, если не указан. Используйте как ''.join(fileinput.input()) .

И то sys и другое fileinput должно быть импортировано, соответственно, конечно.

Быстрые sys.stdin примеры, совместимые с Python 2 и 3, Windows, Unix

Вам просто нужно read из sys.stdin , например, если вы данные по конвейеру стандартного ввода:

Мы видим, что sys.stdin в текстовом режиме по умолчанию:

пример файла

Скажем, у вас есть файл, inputs.txt мы можем принять этот файл и записать его обратно:

Более длинный ответ

Вот полная, легко воспроизводимая демонстрационная программа с использованием двух методов: встроенной функции input (используется raw_input в Python 2) и sys.stdin . Данные не изменены, поэтому обработка не является операцией.

Для начала давайте создадим файл для входных данных:

И используя код, который мы уже видели, мы можем проверить, что мы создали файл:

Вот справка по sys.stdin.read Python 3:

Встроенная функция, input ( raw_input в Python 2)

Встроенная функция input читает от стандартного ввода до новой строки, которая удаляется (дополняет print , по умолчанию добавляет новую строку.) Это происходит до тех пор, пока не получит EOF (конец файла), после чего она поднимается EOFError .

Таким образом, вот как вы можете использовать input в Python 3 (или raw_input в Python 2) чтение из stdin - поэтому мы создаем модуль Python, который мы называем stdindemo.py:

И давайте распечатать его обратно, чтобы убедиться, что это так, как мы ожидаем:

Опять же, input читает до новой строки и по существу удаляет его из строки. print добавляет новую строку. Поэтому, пока они оба изменяют ввод, их модификации отменяются. (Таким образом, они по существу являются дополнением друг друга.)

И когда input получает символ конца файла, он вызывает EOFError, который мы игнорируем и затем выходим из программы.

А в Linux / Unix мы можем передать из cat:

Мы также можем выполнить модуль как скрипт:

Вот справка по встроенному input из Python 3:

sys.stdin

Здесь мы делаем демонстрационный скрипт, используя sys.stdin . Эффективный способ перебора файловоподобного объекта - использование файловоподобного объекта в качестве итератора. Дополнительный метод для записи в стандартный вывод из этого ввода - просто использовать sys.stdout.write :

Распечатайте его обратно, чтобы убедиться, что он выглядит правильно:

Гольф в команду:

Файловые дескрипторы для игры в гольф

Поскольку файловые дескрипторы для stdin и stdout равны 0 и 1 соответственно, мы также можем передать их open в Python 3 (не 2, и обратите внимание, что нам все еще нужна буква 'w' для записи в стандартный вывод).

Если это работает в вашей системе, это сбрит больше символов.

Python 2 также io.open делает это, но импорт занимает гораздо больше места:

Обращаясь к другим комментариям и ответам

Один комментарий предлагает ''.join(sys.stdin) для игры в гольф, но на самом деле это дольше, чем sys.stdin.read () - плюс Python должен создать дополнительный список в памяти (вот как str.join работает, когда не дан список) - для контраста:

Верхний ответ предполагает:

Но, поскольку sys.stdin реализует файловый API, включая протокол итератора, это то же самое, что и это:

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

Ввод мы будем осуществлять из файла input.txt

Вывод будем производить в файл output.txt

Для организации ввода данных из файла надо:

1.Связать текстовый файл для чтения исходных данных с input:

assign(input,'input.txt').

2. Открыть файл для чтения:
reset(input);

3. При работе нужно понимать и помнить отличия процедуры read, от readln. Если в файле данные записаны в одной строке, через пробел, то мы пользуемся все время процедурой read столько раз, сколько чисел нужно прочитать.
Если же строк несколько, то когда доходим до символа стоящего в конце строки, используем readln. В результате чего будет считано последнее число строки и курсор переместится на новую.
read(a); readln(a);

Например, указан следующий формат ввода:

4. Как только все переменные прочитаны необходимо закрыть файл.
close(input);

Для организации вывода данных в файл надо:

1.Связать текстовый файл для записи результатов с output:

assign(output,'output.txt').

2. Открыть файл для записи:
rewrite(output);

3.Для вывода используем операторы write и writeln также, как и было до сих пор.

4. Как только все переменные выведены необходимо закрыть файл.

Задание 1. Перенаправление. Прочитайте число n из файла input.txt и выведите его в файл output.txt

Program z1;
var a:longint;
Begin
assign(input,'input.txt');
reset(input);
read(a);
close(input);
assign (output,'output.txt');
rewrite(output);
writeln(a);
close(output);
End.

Экспериментальный раздел

Наберите программу в среде программирования Free Pascal, запустите ее на исполнение. У Вас может появится ошибка типа:
exited with exitcode=2 (для Free Pascal), если файла input.txt нет.

Создайте в папке, где сохранена ваша программа файл input.txt и введите в него число.

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

Переход между окнами входных, выходных данных и текстом программы осуществляется нажатием клавиши F6.

Задание 2. Сумма двух чисел. Даны числа А и В (0<А, B<=32000). Найти сумму А+В и вывести ее в выходной файл.

Выходные данные:
В единственную строку выходного файла вывести сумму этих чисел.
Тесты Посмотреть решение

Задание 3. Перепутал строки. Даны два числа А и В(0<=А,В<2 000 000 000). Вывести числа в обратном порядке.

Выходные данные:
В первой строке выходного файла должно быть число В.
Во второй строке выходного файла число А.
Тесты Посмотреть решение

Задание 4. Имеется текстовый файл на 10 строк. Вывести на экран:
а) его первую строку;
б) его пятую строку;
в) его первые 5 строк;
г) его строки с s1-й no s2-ю (s1 и s2 записаны в 11 строке входного файла через пробел);
д) весь файл.


Тесты Посмотреть решение

Задание 5. Сформируйте массив целых чисел (значения для него взять из файла, они записаны во 2-ой строке входного файла). В первой строке этого файла указано количество элементов массива (n<=50). Вывести в выходной файл количество отрицательных чисел массива, его наименьшее и наибольшее значения.

Во второй строке входного файла содержатся N чисел через пробел - элементы массива

Выходные данные:
Первая строка - количество отрицательных элементов массива

Третья строка - наибольший элемент массива

Тесты Посмотреть решение

assign (output,'t1.txt');
rewrite(output);
writeln(t);
close(output);

assign(input,'t.txt');
reset(input);
read(s);
close(input);

assign (output,'t2.txt');
rewrite(output);
writeln(s);
close(output);
End.

Для каждого входного файла
Первая строка содержит число n - количество строк
Вторая строка - n-ая строки содержат текст Выходные данные:
Для каждого выходного файла
Первая строка - n-ая строка содержат текст

Тесты Посмотреть решение

Задание 8. Даны три целых числа. Определить, имеется ли среди них хотя бы
одна пара равных между собой чисел. Выходные данные:
Выведите 'YES' если это так, и 'NO' в противном случае.

Тесты Посмотреть решение


Задание 9. Даны три числа. Определить, существует ли треугольник, сторонами которого являются эти числа, и если существует, найти его площадь. Выходные данные:
В первой строке запись "да" или "нет"
Во второй строке значение площади, если треугольник существует

Тесты Посмотреть решение

Задачи для самостоятельного решения

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