2016-10-10 6 views
1

Для этой программы я должен либо написать свое имя на терминал, либо в выходной файл, указанный пользователем (case 'f').Программа не создает файл, используя имя, указанное в командной строке.

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    // no output file print to screen, print name to terminal 
    if (argc < 2) 
    { 
     fprintf(stdout, "name\n"); 
    } 
    //print name to output file given by user 
    else 
    { 
     int option; 
     int fFlag = 0; 
     while ((option = getopt(argc, argv, "f:")) != -1) 
     { 
      //if case 'f' print to output file 
      switch (option) 
      { 
       case 'f': 
        fFlag = 1; // flag indicates writing name to file 
        break; 
        //case f or error 
       case '?': 
        printf("error"); 
        break; 
      } 
     } 
     //write to name to output file 
     if (fFlag) 
     { 
      FILE *file = fopen(argv[1], "w"); 
      fprintf(file, "name"); 
     } 
    } 
    return 0; 
} 

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

Файл в командной строке может и не существовать. Я должен создать файл в программе?

Я понимаю, что я делал неправильно. Спасибо всем!

+0

Вы установили, что 'argv [1]' содержит имя файла, которое вы пытаетесь открыть для доступа к записи, (b) убедитесь, что 'файл' не является NULL, прежде чем пытаться записать на него, и (c) при условии, что оба этих параметра будут включены в текущий рабочий каталог *, где ваша программа выполняет установленный файл, который вы пытались создать? Прямо сейчас (а) и (б) кажутся потенциальными кандидатами, последний является ярким примером нарушения [Шестой заповеди Спенсера] (http://www.seebs.net/c/10com.html) – WhozCraig

+0

С переформатированным кодом, он появляется 'fprintf (файл,« name »);' находится только в случае 'argc <2' – chux

+0

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

ответ

4

В дополнение к тому, что говорили комментаторы, вы используете getopt для части вашего разбора, поэтому должны использовать его для остальных!

int main... 
char *filename; /**1**/ 
... 
    case 'f': 
    fFlag = 1; 
    filename = optarg; /**2**/ 
.... 
    FILE *file = fopen(filename , "w"); /**3**/ 

Объяснение: f: к getopt означает, что getopt будет пытаться найти тот вариант, который идет вместе с f. В цикле getopt, в случае 'f' эта опция помещается в переменную optarg. По крайней мере, для GNU getopt, это указатель на argv, поэтому вам не нужно его копировать. Вы можете просто указать значение указателя (в *2* выше) в переменную, которую вы создали для этой цели (*1*). Затем вы можете открыть этот файл независимо от того, где он находится в argv (*3*). См. Обработку варианта c в GNU getopt example.

Редактировать Вы не показали командную строку, которую вы используете, но я предполагаю, что это что-то вроде

./foo -f my-output-file.txt 

— в этом случае argv[1] является -f и argv[2] является my-output-file.txt. (argv[0] - это имя исполняемого файла.) Следовательно, fopen(argv[1], ...) - это не то, что вы хотите;).

+0

Спасибо за помощь! Я заработал. – name