Объясните как работает программа копирующая входной поток в выходной?
прочитать символ
Вот сама программа:
while (символ не является символом-конца-файла)
вывести прочитанный символ
прочитать символ
Если все это перевести на C, получиться вот что:
#include
main ()
{
int c;
c = getchar () ;
while (c ! = EOF) {
putchar (c) ;
c = getchar () ;
}
}
Почему говорят что он возвращает или копирует или там выдает свое значение что ???
1) Теперь объясните, как работает этот цикл? while (c ! = EOF)
2) Что такое EOF (я знаю что это значит "конец файла" НО конец какого файла? что это вообще такое конец файла и причем тут переменная c и операция "не равно" ???(! =).
3) И конец программы говорит прочитать символ вот: c = getchar () ; это что типо он опять возвращается наверх? не понимаю?
4) И ещё поток символом - это последовательность символов, разбитых на строки; КАЖДАЯ СТРОКА ЗАКАНЧИВАЕТСЯ СПЕЦИАЛЬНЫМ СИМВОЛОМ конца строки и может быть ПУСТОЙ и содержать НЕКОТОРОЕ КОЛИЧЕСТВО СИМВОЛОВ. P.s Объясните все выделенные моменты определения:
1) какой специальный символ? что это значит?
2) и может быть пустой, не понял дальше вообще...?
Другие языки программирования и технологии
Язык программирования C.
Источниками данных обычно являются файлы и потоки. В общем виде всё является потоком – стандартным или файловым, какая разница.
EOF – это сообщение от операционной системы, что данные в потоке закончились. Поэтому цикл читает данные (в вашем случае по одному символу) пока данные в потоке не закончатся.
Строки в языке С ноль-терминированные. Роль терминатора выполняет код со значением 0, но это не тот ноль, который символ '0' имеющий код 48. То есть если создать массив char следующим образом:
char line[] = { 'a', 'b', 'c' };
и попытаться его вывести, с помощью puts, то вывод на трёх символах скорее всего не закончится и в лучшем случае будет дополнен мусором. Чтобы добиться нужного результата следует написать вот такими тремя способами:
char line[] = { 'a', 'b', 'c', 0 };
char line[] = { 'a', 'b', 'c', '\0' };
char line[] = "abc";
В последнем случае ноль-терминатор подставится автоматически. Это и имеется ввиду, когда говорится, что строки могут быть пустыми. То есть конструкции
char line[] = "";
char* line = "";
имеют право на жизнь. А вот создать пустой статический символьный массив у вас не поучится.
Поэтому в строках символы могут содержаться, а могут и нет.
Код 10, он же '\n' в строке, как правило выполняет перевод на другую строку и вовсе не означает конец строки, так как вы можете создать такую строку:
const char* line = "abc\ndef\nghi";
puts(line);
в результате получите три строчки:
abc
def
ghi
То что вас волнует, называется считыванием из стандартного потока stdin последовательности символов. И в данном случае использовать макроконстанту EOF некорректно, потому что под стандартный поток ввода система выделяет буфер определённого размера и достигнуть его конца путём ввода символов с клавиатуры, по соображением безопасности невозможно. А значит и невозможно достичь EOF.
Ваш код следует переписать следующим образом:
#include <stdio.h>
#include <stdlib.h>
#define END 0x0A
int main() {
char ch;
do {
ch = getchar();
putchar(ch);
} while (ch != END);
system("pause");
}
После чего ввести строку символов и нажать клавишу Enter
EOF – это сообщение от операционной системы, что данные в потоке закончились. Поэтому цикл читает данные (в вашем случае по одному символу) пока данные в потоке не закончатся.
Строки в языке С ноль-терминированные. Роль терминатора выполняет код со значением 0, но это не тот ноль, который символ '0' имеющий код 48. То есть если создать массив char следующим образом:
char line[] = { 'a', 'b', 'c' };
и попытаться его вывести, с помощью puts, то вывод на трёх символах скорее всего не закончится и в лучшем случае будет дополнен мусором. Чтобы добиться нужного результата следует написать вот такими тремя способами:
char line[] = { 'a', 'b', 'c', 0 };
char line[] = { 'a', 'b', 'c', '\0' };
char line[] = "abc";
В последнем случае ноль-терминатор подставится автоматически. Это и имеется ввиду, когда говорится, что строки могут быть пустыми. То есть конструкции
char line[] = "";
char* line = "";
имеют право на жизнь. А вот создать пустой статический символьный массив у вас не поучится.
Поэтому в строках символы могут содержаться, а могут и нет.
Код 10, он же '\n' в строке, как правило выполняет перевод на другую строку и вовсе не означает конец строки, так как вы можете создать такую строку:
const char* line = "abc\ndef\nghi";
puts(line);
в результате получите три строчки:
abc
def
ghi
То что вас волнует, называется считыванием из стандартного потока stdin последовательности символов. И в данном случае использовать макроконстанту EOF некорректно, потому что под стандартный поток ввода система выделяет буфер определённого размера и достигнуть его конца путём ввода символов с клавиатуры, по соображением безопасности невозможно. А значит и невозможно достичь EOF.
Ваш код следует переписать следующим образом:
#include <stdio.h>
#include <stdlib.h>
#define END 0x0A
int main() {
char ch;
do {
ch = getchar();
putchar(ch);
} while (ch != END);
system("pause");
}
После чего ввести строку символов и нажать клавишу Enter
2) Файл читается подряд, байт за байтом. Результат функции getchar типа int. Значит любой байт будет трактоваться как значение int 0..255. Когда чтение дошло до конца файла, и больше читать уже нечего, функция getchar возвращает специальное значение EOF, численно равное -1. Это и называется "конец файла".
В данном случае читается не файл, а консоль. Но это не важно, принцип тот же самый. Через консоль можно ввести "конец файла" специальной комбинацией клавиш (Ctrl+Z или Crtl+D, точно не знаю). Кроме того, ввод программы может быть не с консоли, а из настоящего файла.
4) Символ конца строки - обычно это символ с кодом 10. Это зависит от операционной системы. Этот символ соответствует клавише Enter.
В данном случае читается не файл, а консоль. Но это не важно, принцип тот же самый. Через консоль можно ввести "конец файла" специальной комбинацией клавиш (Ctrl+Z или Crtl+D, точно не знаю). Кроме того, ввод программы может быть не с консоли, а из настоящего файла.
4) Символ конца строки - обычно это символ с кодом 10. Это зависит от операционной системы. Этот символ соответствует клавише Enter.
Гена Шаронов
Когда чтение дошло до конца файла, и больше читать уже нечего, функция getchar возвращает специальное значение EOF, численно равное -1. Это и называется "конец файла". ВНИК ну никак не понял, чтение чего? по подробней
Гена Шаронов
можно скайп? чисто по микро по общаться
Гена Шаронов
буду благодарен, )
Похожие вопросы
- Стоит ли изучать язык программирования C++ ?И какое преимущество этого языка? Где он мне пригодится ?
- Основные различия языка программирования C# от С++.
- Вопрос по языку программирования C# (СиШарп) (очень простой вопрос)
- Я учусь в 5 классе и хочу научится языку программирования C++.
- Язык программирования C#
- Сложно ли будет изучить язык программирования C#?
- Почему язык программирования C++ считается одним из самых сложных языков программирования?
- Умрёт ли язык программирования C++?
- Функции в языке программирования C.
- У вас такие же ощущения от языков программирования ? (C++ vs C#)