Xcode и передача аргументов командной строки
-
19-09-2019 - |
Вопрос
Я только начал работать с C & Xcode и столкнулся с небольшой трудностью.
Все, что я хочу сделать, это прочитать файл из командной строки и увидеть выходные данные в терминале.Я думаю, что моя проблема связана с путем к файлу, который я хочу прочитать.Я использую Mac, и файл находится на моем рабочем столе, поэтому путь должен быть Users/myName/Desktop/words.txt
.Правильно ли это?
Это мой код:
#import <Foundation/Foundation.h>
int main (int argc, const char* argv[]){
if(argc == 1){
NSLog(@" you must pass at least one arguement");
return 1;
}
NSLog(@"russ");
FILE* wordFile = fopen(argv[1] , "r");
char word[100];
while (fgets(word,100,wordFile)) {
NSLog(@" %s is %d chars long", word,strlen(word));
}
fclose(wordFile);
return 0;
}//main
Решение
Если вам нужен путь к файлу в OS X, простой способ получить его - просто перетащить файл в окно Terminal.app, где вы вводите команду.Вуаля!
Другие советы
Путь к рабочему столу - это /Users/[username]/Desktop/
~/Desktop/
является независимым от пользователя способом обозначения этого, ~
представляет домашний каталог текущего пользователя.Он должен быть расширен с помощью такого метода, как stringByExpandingTildeInPath
Не уверен насчет использования C # (я никогда не использовал его в Mac OS X), но в Objective-C / Cocoa вы бы сделали..
// Get array with first index being path to desktop
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDesktopDirectory, NSUserDomainMask, YES);
// Get the first element
NSString *desktopPath = [paths objectAtIndex:0];
// Append words.txt to path
NSString *theFilePath = [desktopPath stringByAppendingPathComponent:@"words.txt"];
NSLog(@"%@", theFilePath);
Это самый надежный способ получить путь к рабочему столу, поскольку пользователь технически может переместить свою папку на рабочем столе в другое место (хотя это довольно маловероятно).Другим допустимым вариантом является использование метода NSString stringByExpandingTildeInPath
:
NSString *desktop = [@"~/Desktop" stringByExpandingTildeInPath];
NSString *theFile = [desktop stringByAppendingPathComponent:@"words.txt"]
Как я уже сказал, оба они написаны на Objective-C, но перевести на C # не должно быть сложно, при условии, что вы можете получить доступ к библиотекам Cocoa.
Опубликованный вами код работает корректно:
dbr:.../build/Debug $ ./yourcode ~/Desktop/words.txt
yourcode[2106:903] russ
yourcode[2106:903] this is words.txt is 17 chars long
Ваш терминал автоматически расширяет ~/
путь тильды
Закрыть...это
/{Volume}/Users/myName/Desktop/words.txt
...где {Volume} - это название вашего жесткого диска.Вы также можете попробовать использовать:
~/Desktop/words.txt
...где ~
понимается как "ваш домашний каталог", но это может быть неправильно разрешено.
(Примечание - похоже, это вопрос C, а не C #)
На самом деле, вы можете сделать:
/Users/myName/Desktop/words.txt
Вам не обязательно указывать путь к тому.
Однако, чтобы получить полный путь в C, вы должны сделать что-то вроде:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char *home, *fullPath;
home = getenv("HOME");
fullPath = strcat(home, "/Desktop/words.txt");
Проблема, с которой вы сталкиваетесь при передаче имени файла в качестве аргумента, заключается в том, что вам нужно установить текущий рабочий каталог в место, где существует файл.