2017-01-17 11 views
-3

В настоящее время код читает файл и отсортировать записи, как показано ниже,прочитать файл с помощью ARGV

#include"fileIO/file.h" 

#define MAX_RECORD_SIZE 256 // Bad style 


typedef struct{ 
    int age; 
    char *lastName; 
    char *firstName; 
}Person; 

..... 



int main(int argc, char *argv[]){ 

    FILE *pFile = fopen("file.txt", "r"); 

    .... 
    callInsertionSort(getItemList(cache), getSize(getItemList(cache)), less); 

} 

где file.txt есть,

Age,LastName,FirstName 
50,B,A 
30,A,B 
20,X,D 
10,F,A 
10,A,B 
90,V,E 
60,N,M 

Исполнение:

$./sort.exe 
Before sorting 
Age,LastName,FirstName 
    50 B A 
    30 A B 
    20 X D 
    10 F A 
    10 A B 
    90 V E 
    60 N M 
After sorting 

Age,LastName,FirstName 
    10 F A 
    10 A B 
    20 X D 
    30 A B 
    50 B A 
    60 N M 
    90 V E 

Вопрос:

Без использования fopen(), есть способ, чтобы получить оболочку, чтобы передать содержимое file.txt в качестве аргументов командной строки, один аргумент в каждой строке в файле, (через argv путем передачи команды оболочки (sort.exe))?

+2

Используйте имя файла из 'argv' как аргумент' fopen() ', в чем проблема? – Barmar

+0

@Barmar Я не хочу использовать 'file' api для чтения' file.txt'. Могу ли я передать параметры командной строки для чтения содержимого? – overexchange

+0

Можете ли вы объяснить, что вы имеете в виду? Что означает «Мы можем прочитать file.txt через argv»? –

ответ

4

Вы можете запустить программу как:

IFS=$'\n' 
./sort.exe $(cat file.txt) 

Каждая строка файла будет являться аргументом к программе (установка IFS просто перевод строки предотвращает пробелы в файле с разделителями, являющихся аргументами).

Затем программа может контура argv (кроме argv[0], которая содержит имя программы), чтобы получить все строки для сортировки.

Обратите внимание, что существует ограничение на размер аргументов, поэтому этот метод не очень масштабируемый. Чтение из файла обычно предпочтительнее.

FYI, $(cat file.txt) также можно записать в виде $(< file.txt)

+0

Также вы можете использовать $ ( mASOUD

+0

На что, является ли ограничение на размер аргументов, зависит? – overexchange

+0

См. Http://stackoverflow.com/questions/19354870/bash-command-line-and-input-limit – Barmar

2

Если цель состоит в том, чтобы передать каждую строку файла в качестве отдельного аргумента командной строки для программы sort.exe, то вы будете нуждаться в Bash (который в тегах), и вы можете использовать:

IFS=$'\n'; sort.exe $(cat file) 

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

verbiage 
spaced⧫out 
⧫leading⧫and⧫trailing⧫ 
⧫⧫multiple⧫⧫spaces⧫⧫everywhere⧫⧫ 

Выполнение команды дает:

$ (IFS=$'\n'; printf '[%s]\n' $(cat file)) 
[verbiage] 
[spaced out] 
[ leading and trailing ] 
[ multiple spaces everywhere ] 
$ 

Это использует внешний (…) для выполнения команды в суб-оболочке, так что мое интерактивное IFS не перепутались. Они не нужны в некоторых других контекстах.

Обратите внимание, что существует верхняя граница того, как долго могут быть аргументы командной строки (плюс переменные среды) - это иногда целых 256 KiB и редко больше. Это означает, что вы можете позволить себе делать это с помощью достаточно маленьких файлов. В большинстве случаев вам лучше следовать команде Unix (POSIX) sort и считывать данные прямо из имени файла, указанного в качестве аргумента, в команду sort.