То, что вы в сущности говорите:
Консоль: Запустите my_program и запишите все, что он выводит в te s t.txt.
Программа: Откройте te x t.txt и запишите любой ввод в stdin этого файла.
У вашей консоли обычно есть три стандартных потока stdin
, stdout
и stderr
. Эти потоки вы можете перенаправить . Если вы работаете в Windows, посмотрите, например, перенаправление .
Когда вы говорите ./my_prog > test.txt
, то, что вы говорите своей консоли (не my_prog
), это записать что-нибудь my_prog
, записывающее stdout
в файл test.txt
.
Если вы в своем коде говорите, т. Е. printf("Hello");
, тогда Hello будет записано в файл test.txt
.
Если бы вы перевернули перенаправление, сказав вместо этого ./my_prog < test.txt
, было бы; передать файл test.txt в my_prog . Что, в свою очередь, если бы в test.txt был какой-либо текст, привело бы к копированию test.txt в text.txt.
Теперь в своем коде вы говорите:
int main(void)
{
int ch;
FILE *input;
/* Here you open a handle to the file text.txt for reading and writing */
input = fopen("text.txt", "w+");
while ((ch = getchar()) != EOF) { /* get next char from stdin */
fputc(ch, input); /* write that char to the handle input */
}
fclose(input); /* close the handle */
return 0;
}
Итак, что произойдет, как вы запустите это:
В вашем коде:
- Открыть текст.txt
- Ожидание ввода (данные вводятся в стандартный ввод) - обычно пользователь вводит текст в консоль, передается в программу при нажатии Ввод .
В консоли:
- Перенаправить что-нибудь из
my_prog
в test.txt.
Вы говорите:
скрипт не достигает EOF
Ну, так как он читает из stdin
, он только (не без исключения) получит EOF при двух условиях.
Если вы перенаправите файл в вашу программу. То есть ./my_prog < foo.txt
(уведомление <
, а не >
).
- Что тогда произойдет, это то, что my_prog
будет читать данные из файла foo.txt
, и когда этот файл завершится, ваша программа получит EOF. И, следовательно, выйти.
Если вы вручную введете EOF в stdin
.
- В Linux и OSX Ctrl - D , в Windows Ctrl - Z
Теперь, если вы проверите это, набрав текст на консоли, помните, что действия записи, такие как fputc()
, буферизуются. Это означает, что данные не сразу записываются в файл, а только когда в буфере находится определенный объем данных, вызывается fflush()
, поток закрывается, вы отключаете буферизацию и т. Д.
Также; если вы запустите свою программу. Введите текст, введите еще какой-нибудь текст, а затем нажмите Ctrl-C , чтобы прервать выполнение программы. Вероятность того, что вы закончите без данных в вашем text.txt
.
, велика.
Причина этого в том, что программа убита и поэтому fclose()
никогда не вызывается, и, следовательно, нет сброса в файл.
В ваших дальнейших усилиях в программировании было бы очень неплохо выработать привычку ничего не предполагать. То есть не предполагайте, что fopen()
в порядке.
FILE *fh;
char *outfile = "foo.txt";
if ((fh = fopen(outfile, "w")) == NULL) {
fprintf(stderr,
"Unable to open file %s\n --",
outfile);
perror(" fopen() ");
return 1;
}
У большинства функций есть способ проверить, была ли операция успешной. То есть:
if (fputc(ch, fh) != ch) { err ...
Это сделает ваш код намного безопаснее, даст подсказки о том, где он не работает и т. Д.
Некоторые ссылки: