Xcode e passando argumentos de linha de comando
-
19-09-2019 - |
Pergunta
Eu só comecei a trabalhar com C & Xcode e eu correr em um pouco de dificuldade.
Tudo que eu quero fazer é ler um arquivo a partir da linha de comando e ver a saída no terminal.
Acho que minhas mentiras problema com o caminho para o arquivo que eu quero ler. Eu estou usando um Mac e o arquivo está no meu desktop, de modo que o caminho deve ser Users/myName/Desktop/words.txt
. É este correto?
Este é meu código:
#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
Solução
Se você precisar o caminho para um arquivo no OS X, uma maneira fácil de obtê-lo é simplesmente arrastar o arquivo para a janela do Terminal.app onde você está digitando o comando. Voila!
Outras dicas
O caminho para a área de trabalho é /Users/[username]/Desktop/
~/Desktop/
é uma forma agnóstica pelo usuário de denotar isso, ~
representa o diretório home do usuário atual. Deve ser expandida usando um método como stringByExpandingTildeInPath
Não tenho certeza sobre o uso de C # (eu nunca usei isso no Mac OS X), mas em Objective-C / cacau, você faria ..
// 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);
Esta é a maneira mais robusta de obter o caminho área de trabalho, como um usuário poderia tecnicamente mover seu desktop pasta mais onde (embora isso seja bastante improvável). Outra opção válida é usar o método stringByExpandingTildeInPath
NSString:
NSString *desktop = [@"~/Desktop" stringByExpandingTildeInPath];
NSString *theFile = [desktop stringByAppendingPathComponent:@"words.txt"]
Como eu disse, tanto aqueles estão em Objective-C, mas não deve ser difícil de traduzir para C #, supondo que você pode obter nas bibliotecas de cacau.
O código que você postou funciona corretamente:
dbr:.../build/Debug $ ./yourcode ~/Desktop/words.txt
yourcode[2106:903] russ
yourcode[2106:903] this is words.txt is 17 chars long
Seu terminal expande automaticamente o caminho ~/
Tilda
Fechar ... é de
/{Volume}/Users/myName/Desktop/words.txt
... onde {Volume} é o nome do seu disco rígido. Você também pode tentar usar:
~/Desktop/words.txt
... onde ~
Entende-se por "seu diretório home", mas isso pode não resolver corretamente.
(Nota - Esta parece ser uma questão C, não um C # questão)
Na verdade, você pode fazer:
/Users/myName/Desktop/words.txt
Você não tem que dar o caminho para o volume.
No entanto, para obter o caminho completo na C você faria algo como:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char *home, *fullPath;
home = getenv("HOME");
fullPath = strcat(home, "/Desktop/words.txt");
O problema que você está correndo para com o passar o nome do arquivo como um argumento é que você precisa para definir o diretório de trabalho atual para o local onde o arquivo existe.