Помогите с небольшой проблемой чтения текстового файла с помощью оператора перенаправления '<' в командной строке?С - PullRequest
0 голосов
/ 23 сентября 2011

Я искал все выше и ниже, но не могу найти ответ на то, что мне показалось бы довольно простым вопросом.Я довольно новичок в C, и из-за ограничений, наложенных на меня во время этого проекта, у меня возникли проблемы с выяснением, как это сделать.

Я пытаюсь читать текст из текстафайл и сохранить эти данные в массиве.Достаточно просто.ОДНАКО, я вынужден сделать это с помощью оператора командной строки '<' и перенаправить стандартный ввод в текстовый файл.</p>

Единственный способ понять, как правильно открыть файл и выполнить последующие операции, заключается в следующем:

#include <stdio.h>  


FILE *fr;           

main()

{

   fr = fopen ("mytext.txt", "r");  /* open the file for reading */

Проблема в том, что я не могу показатьсячтобы первым параметром fopen () было имя файла, предоставленное stdin '<'.Это работает, только если я явно ввожу строку для параметра.Например, если бы я должен был запустить </p>

myprog.o < mytxt.txt

, как я мог бы передать имя текстового файла, предоставленного этим перенаправлением stdin, в функцию fopen?Или есть другой / лучший способ сделать то, что я пытаюсь сделать?

Заранее спасибо.

Ответы [ 4 ]

5 голосов
/ 23 сентября 2011

Вам нужно читать с stdin вместо того, чтобы пытаться открыть файл напрямую.

Это из-за того, как работает перенаправление - подумайте немного об этом:

  1. Файл открыт (для демонстрации, скажем, для этого используется fopen).
  2. Существующий stdin закрыт. Он больше не относится к терминалу или подобной конструкции.
  3. stdin заменяется открытым файлом на шаге 1.
  4. Любые чтения из stdin теперь работают напрямую из входного файла.

Используя перенаправление ввода, вы можете разрешить пользователю перенаправлять файл или напрямую вводить контент в вашу программу.

Что касается вашей реальной проблемы, вам лучше передать имя файла в качестве аргумента вашей программе. Вы бы использовали argv и назвали бы свою программу так:

myprog.o mytxt.txt

В этом случае argv[1] будет mytxt.txt.

3 голосов
/ 23 сентября 2011

Программа на C никогда не видит перенаправление, потому что оно обрабатывается оболочкой. Программа на C должна посмотреть argc и прочитать из stdin, если аргументы не заданы, или из данных файлов в противном случае.

3 голосов
/ 23 сентября 2011

В <stdio.h> объявлен стандартный дескриптор FILE*, который указывает на стандартный ввод для выполняющегося процесса. Такой дескриптор файла называется stdin.

0 голосов
/ 23 сентября 2011

Если все, что вы хотите, чтобы эта программа делала, это чтение со стандартного ввода, то вам не нужно открывать какие-либо файлы.Библиотеки OS и C будут открывать и закрывать файл для вас.

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

#include <stdio.h>

int main( int argc, char ** argv ) {
    int ch = getchar();
    while ( ch != EOF ) {
        putchar( ch );
        ch = getchar();
    }
}

Как видите, нет открытия или закрытия файлов.putchar и getchar запись в stdin и stdout относительно.

Если вы хотите быть более явным, вы можете использовать предопределенные файловые дескрипторы.1013 * и fprintf(), scanf() и fscanf() и все другие замечательные функции stdio.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...