2014-01-21 3 views
1

В основном я хочу иметь программу с int main (argc, * argv []), и вместо того, чтобы писать символы в командной строке, я хочу, чтобы моя программа прочитала эти слова из файла. Как я мог это сделать? Есть ли специальная команда в Linux для этого?Как читать файл в командной строке?

+0

"читать эти слова из файла"? Какие слова? Аргументы командной строки? –

+0

https://gist.github.com/anonymous/928ada24aa8e6e1adda9 номер файла 3, верхние обложенные слова в качестве аргументов командной строки – deviance

+0

Вы хотите прочитать список слов из файла, а затем использовать эти слова в качестве аргументов командной строки для своего/другого программа? –

ответ

2

Вы можете использовать стандартные операции перенаправления в * NIX оболочке для передачи файлов в качестве входных данных:

./myprogram < inputfile.txt 

Это утверждение выполняет свою программу (MyProgram) и перекачивают данные внутри от inputfile.txt к вашей программе

Вы также можете перенаправить вывод программы в файл, аналогичным образом:

./myprogram > outputfile.txt 
1

Использование Перенаправление

yourprogram < youtextfile 

предложит содержание yourtextfile в качестве стандартного ввода (стандартного ввода) в yourprogram. Точно так же

yourprogram > yourothertextfile 

будет посылать все программы записывают на стандартный вывод (стандартный вывод) в yourothertextfile

Вы заметите при чтении страницы человека, что большинство системных вызовов имеют версию, которая работает непосредственно с стандартным вводом или стандартным выводом

Для примера рассмотрим printf семейство:

printf ("hello world\n"); 

более короткая версия

fprintf (stdout,"hello world\n"); 

а также для scanf и stdin.

Это только самое основное использование перенаправления, которое, на мой взгляд, является одним из ключевых аспектов «unix-способа делать вещи». Таким образом, вы найдете множество статей и руководств, которые показывают примеры, которые намного более продвинуты, чем то, что я написал здесь. Посмотрите на this Linux Documentation Project page на перенаправление, чтобы начать.

EDIT: получение входного сигнала через перенаправление ior интерактивно «выглядит» одинаково для программы, поэтому он будет реагировать на перенаправленный вход так же, как на вход консоли. Это означает, что если ваша программа ожидает линии передачи данных (например, потому что она использует gets() для чтения строк), текстовый файл ввода должен быть организован в строках.

+0

Ну, это странно, любая идея о том, почему это не работает? Текстовый файл имеет в нем слова, но когда я это делаю ./a.out deviance

+0

hard сказать, не видя как код, так и текстовый файл ... Мне нужно идти сейчас, я сделаю быстрый edi t, которые могут помочь вам понять, почему это может потерпеть неудачу. – fvu

+0

Вот он: https://gist.github.com/anonymous/928ada24aa8e6e1adda9 номер программы 1 использует этот txt-файл для чтения слов верхнего регистра и помещает их в дерево, тогда как программа 2 преобразует любой текст в слова верхнего регистра без цифр или любой другие не-альфа-символы. Файл 3 - это текст, но значительно сокращенный - он содержит несколько тысяч слов, и каждый из них должен перейти в командную строку – deviance

0

По умолчанию каждая программа вы выполняете на POSIX-совместимых систем имеет три открытых файловых дескрипторов (см <unistd.h> для определения макросов,): стандартный ввод (STDOUT_FILENO), стандартный вывод (STDOUT_FILENO), и вывод ошибок (STDERR_FILENO), который привязан к консоли.

Поскольку вы сказали, что хотите читать строки, я считаю, что функция ssize_t getline(char **lineptr, size_t *n, FILE *stream) может выполнить эту работу. В качестве третьего аргумента требуется поток (), поэтому для открытия файла необходимо либо использовать fopen(3), либо комбинацию open(2) и fdopen(3).

Получение вдохновения от man 3 getline, здесь программы демонстрирует, что вы хотите:

#define _GNU_SOURCE 
#include <stddef.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 
    FILE *fp; 
    size_t len; 
    char *line; 
    ssize_t bytes_read; 

    len = 0; 
    line = NULL; 
    if (argc > 1) 
    { 
     fp = fopen(argv[1], "r"); 
     if (fp == NULL) 
     { 
      perror(*argv); 
      exit(EXIT_FAILURE); 
     } 
    } 
    else 
     fp = stdin; 

    while ((bytes_read = getline(&line, &len, fp)) != -1) 
     printf("[%2zi] %s", bytes_read, line); 
    free(line); 
    exit(EXIT_SUCCESS); 
} 

без аргументов, эта программа считывает строку из стандартного ввода: вы можете кормить его линию, как echo "This is a line of 31 characters" | ./a.out или выполнить его непосредственно и напишите свой ввод оттуда (завершите с помощью^D).

С файлом в качестве аргумента он выведет каждую строку из файла и выйдет.

+0

. Как бы поместить эти слова в массив 2d char? Я разместил ссылку где-то в комментариях – deviance

+0

Массив массивов 'char' или массив указателей на' char'? Вы можете либо сделать что-то вроде 'memcmp (double_array + index, line, bytes_read)' (с индексом 'счетчик, который вы увеличиваете каждый раз, когда вы вставляете элемент), или для массива указателей' double_array [index] = strdup (строка) '. Вы можете делать все, что хотите, с помощью 'line' в моем фрагменте кода; в том числе дублировать его в любой структуре управления (массив, узел списка и т. д.), которые вы хотите. Я не собираюсь давать вам более конкретный код, так как я считаю, что должен просто ответить на ваш первоначальный вопрос: как читать строки из файла и обрабатывать его. – Diti

1

Вместо того чтобы делать

for(int i = 1; i < argc; i++) 
{ 
    insert(&trie, argv[i]); 
} 

вы могли бы сделать что-то вроде

FILE *input; 
char *line; 

.... 

while (fscanf(input, "%ms", &line) != EOF) { 
    insert(&trie, line); 
     /* If you make a copy of line in `insert()`, you should 
     * free `line` at here; if you do not, free it later. */ 
     free(line); 
} 
+0

Но у меня не будет argc, скажите мне, сколько слов есть, правильно? – deviance

+0

Кроме того, 2 ошибки, когда я добавил это в код: finale.c: 163: 5: предупреждение: ISO C не поддерживает флаг 'm' scanf [-Wformat] finale.c: 163: 18: warning: 'input 'используется неинициализированным в этой функции [-Wuninitialized – deviance

+0

Ну, когда я заставил его скомпилировать его core dump'd – deviance

0

Вы можете иметь исполняемый прочитать аргументы командной строки и использовать xargs, специальная команда Linux для передачи содержимого файла в команду в качестве аргументов.

Альтернатива xargs - parallel.

Смежные вопросы