2012-02-26 4 views
6

Я хочу, чтобы моя программа C попросила пользователя ввести имя файла, который они хотят открыть, и распечатать содержимое этого файла на экране. Я работаю из учебника C и до сих пор имею следующий код. Но когда я его выполняю, это фактически не позволяет мне вводить имя файла. (Я получаю «нажмите любую кнопку, чтобы продолжить», я использую кодовые блоки)Открытие файла из аргументов командной строки в C

Что я здесь делаю неправильно?

#include <stdio.h> 

int main (int argc, char *argv[]) 
{ 
    printf("Enter the file name: \n"); 
    //scanf 
    if (argc != 2) /* argc should be 2 for correct execution */ 
    { 
     /* We print argv[0] assuming it is the program name */ 
     printf("usage: %s filename", argv[0]); 
    } 
    else 
    { 
     // We assume argv[1] is a filename to open 
     FILE *file = fopen(argv[1], "r"); 

     /* fopen returns 0, the NULL pointer, on failure */ 
     if (file == 0) 
     { 
      printf("Could not open file\n"); 
     } 
     else 
     { 
      int x; 
      /* Read one character at a time from file, stopping at EOF, which 
       indicates the end of the file. Note that the idiom of "assign 
       to a variable, check the value" used below works because 
       the assignment statement evaluates to the value assigned. */ 
      while ((x = fgetc(file)) != EOF) 
      { 
       printf("%c", x); 
      } 
      fclose(file); 
     } 
    } 
    return 0; 
} 
+4

+1. Вот как задать вопрос о домашнем задании. «Я зашел так далеко и попал в блокпост», а не «Напиши эту программу для меня». –

ответ

4

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

myprogram myfilename 

, а не просто набрав

myprogram 

и ожидая, что будет предложено. myfilename будет в массиве argv при запуске вашей программы.

Итак, начните с удаления запроса printf("Enter the file name:"). Имя файла будет указано в argv[ 1 ], если вы ввели его в качестве первого параметра после myprogram в командной строке.

5

Это будет читать из stdin имя файла. Возможно, вы хотите сделать это только в том случае, если имя файла не указано как часть командной строки.

int main (int argc, char *argv[]) 
{ 
    char filename[100]; 
    printf("Enter the file name: \n"); 
    scanf("%s", filename); 

    ... 
    FILE *file = fopen(filename, "r"); 
4

Вы смешиваете аргументы командной строки с пользовательским вводом.

Когда вы используете аргументы командной строки, вы выполняете программу и передаете аргументы одновременно. Например:

ShowContents MyFile.txt 

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

ShowContents 
Enter the file name: MyFile.Ttxt 

Ваша программа уже читает первый аргумент argv[1] и рассматривает его как имя файла для открытия. Для того, чтобы иметь программу чтения ввода пользователя, сделать что-то вроде этого:

char str[50] = {0}; 
scanf("Enter file name:%s", str); 

Затем имя файла будет в str, вместо argv[1].

+0

Ах! Вы были правы, я их смешивал. Приветствия за это! – TylarBen