Другие языки программирования и технологии

Язык программирования C.

Объясните как работает программа копирующая входной поток в выходной?
прочитать символ
Вот сама программа:
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) и может быть пустой, не понял дальше вообще...?
Источниками данных обычно являются файлы и потоки. В общем виде всё является потоком – стандартным или файловым, какая разница.

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
Azatkhan Rakhmankulov
Azatkhan Rakhmankulov
66 966
Лучший ответ
2) Файл читается подряд, байт за байтом. Результат функции getchar типа int. Значит любой байт будет трактоваться как значение int 0..255. Когда чтение дошло до конца файла, и больше читать уже нечего, функция getchar возвращает специальное значение EOF, численно равное -1. Это и называется "конец файла".
В данном случае читается не файл, а консоль. Но это не важно, принцип тот же самый. Через консоль можно ввести "конец файла" специальной комбинацией клавиш (Ctrl+Z или Crtl+D, точно не знаю). Кроме того, ввод программы может быть не с консоли, а из настоящего файла.
4) Символ конца строки - обычно это символ с кодом 10. Это зависит от операционной системы. Этот символ соответствует клавише Enter.
Гена Шаронов Когда чтение дошло до конца файла, и больше читать уже нечего, функция getchar возвращает специальное значение EOF, численно равное -1. Это и называется "конец файла". ВНИК ну никак не понял, чтение чего? по подробней
Гена Шаронов можно скайп? чисто по микро по общаться
Гена Шаронов буду благодарен, )