2015-08-07 2 views
1

Я хотел бы перенаправить стандартный ввод на C, чтобы я мог получить номер из файла CSV с scanf и отобразить его на консоли с помощью printf. Это то, что мой код выглядит следующим образом:Как работать с перенаправлением C в Xcode?

int main() { 

    int number; 

    printf("Number:\n"); 
    scanf("%d", & number); 
    printf("The number is %d", number); 

    return 0; 
} 

Я хотел бы указать расположение папки, содержащей файл CSV и файл CSV для перенаправления заранее с

> ./myProject < myCSV.csv 

Но сразу после Я запустить программу, консоль выглядит следующим образом:

Номер:

Когда я набираю код выше, я полагаю, scanf ест > ./myProject < myCSV.csv вверх. Что я делаю не так?

+1

'scanf ("% d ", number);' должно быть 'scanf ("% d ", & number);' – BLUEPIXY

+0

Спасибо, что указали, что вне @BLUEPIXY! – Cesare

ответ

2

Если вы используете вашу программу из Xcode затем использовать Product =>Scheme =>Edit Scheme... (ярлык Command<), чтобы установить аргументы командной строки (включая любые перенаправления ввода/вывода). Вы также можете установить дополнительные переменные среды здесь, если это необходимо.

Обратите внимание, что если вы планируете указать относительные пути в качестве аргументов командной строки, то рабочий каталог, возможно, потребуется установить надлежащим образом - этот параметр находится на вкладке Options, справа от вкладки Arguments в диалоге Edit Scheme....


ОБНОВЛЕНИЕ

К сожалению, кажется, что ошибка введена в Xcode 4 по-прежнему присутствует, по крайней мере, Xcode 6.4, что означает, что перенаправление ввода/вывода задается с помощью описанный выше способ в настоящее время не работает должным образом (как ни странно это работало правильно в Xcode 3 и ранее).

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

#include <stdio.h> 
#include <stdlib.h> 

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

    if (argc > 1) 
    { 
     FILE * fp = freopen(argv[1], "r", stdin); 
     if (fp == NULL) 
     { 
      perror(argv[1]); 
      exit(1); 
     } 
    } 

    printf("Number:\n"); 
    scanf("%d", &number); 
    printf("The number is %d\n", number); 

    return 0; 
} 

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

$ ./my_program    # reads from stdin 
$ ./my_program numbers.csv # reads from numbers.csv 

Как описано выше, в оригинальный ответ (слева для потомков, в случае, если эта ошибка будет исправлена ​​в Xcode 7 или более поздней версии) вы можете задать аргумент командной строки в диалоге Edit Scheme...:

Set command line argument

Как указано выше, вы также должны установить рабочий каталог соответствующим образом - я обычно устанавливаю его на $(PROJECT_DIR), так что он находится в корневом каталоге проекта, но вы можете настроить его на все, что угодно:

Set working directory

+0

Спасибо! Вот как выглядит панель управления схемой. Вы бы установили его таким же образом?Я ценю вашу помощь. http://i.imgur.com/o3Q2648.png – Cesare

+0

Аргументы выглядят ОК, но вам не нужно добавлять 'number' в качестве переменной окружения (я думаю, вы не знакомы с концепциями general * nix?). Также убедитесь, что ваш рабочий каталог правильный, если вы собираетесь использовать относительные пути (см. Вкладку «Параметры», рядом с вкладкой «Аргументы»). –

+0

Спасибо, Пол! Кажется, я не могу заставить его работать, возможно потому, что расположение входного файла неверно. Как вы думаете, я должен поместить CSV-файл в папку, содержащую исполняемый файл? (папка «Продукты»). Ваша помощь очень ценится. – Cesare

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