2012-02-26 4 views
6

Tôi muốn chương trình C yêu cầu người dùng nhập tên của tệp mà họ muốn mở và in nội dung của tệp đó lên màn hình. Tôi đang làm việc từ hướng dẫn C và có đoạn mã sau cho đến nay. Nhưng khi tôi thực hiện nó, nó không thực sự cho phép tôi nhập tên tập tin. (Tôi nhận được 'nhấn bất kỳ nút nào để tiếp tục', tôi đang sử dụng mã hóa)Mở một tệp từ các đối số dòng lệnh trong C

Tôi đang làm gì sai ở đây?

#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. Đây là cách đặt câu hỏi về bài tập về nhà. "Tôi đã đi xa này và đã đánh một rào cản" thay vì "Viết chương trình này cho tôi". –

Trả lời

4

Nếu bạn muốn đọc đầu vào của người dùng từ lời nhắc, bạn sẽ sử dụng hàm scanf(). Để phân tích các thông số dòng lệnh, bạn nên gõ chúng vào dòng lệnh, như trong:

myprogram myfilename 

chứ không phải chỉ cần gõ

myprogram 

, phấn đấu để được nhắc nhở. myfilename sẽ nằm trong mảng argv khi chương trình của bạn bắt đầu.

Vì vậy, hãy bắt đầu bằng cách xóa lời nhắc printf("Enter the file name:"). Tên tệp sẽ là argv[ 1 ] giả sử bạn đã nhập tên đó làm thông số đầu tiên sau myprogram trên dòng lệnh của bạn.

5

Điều này sẽ đọc từ stdin tên tệp. Có lẽ bạn chỉ muốn làm điều này nếu tên tập tin không được cung cấp như là một phần của dòng lệnh.

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

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

Bạn đang trộn lẫn các đối số dòng lệnh với đầu vào của người dùng.

Khi bạn sử dụng đối số dòng lệnh, bạn thực thi chương trình và chuyển các đối số cùng một lúc. Ví dụ:

ShowContents MyFile.txt 

Ngược lại, khi bạn đọc đầu vào người sử dụng, đầu tiên bạn thực hiện các chương trình, sau đó cung cấp tên file:

ShowContents 
Enter the file name: MyFile.Ttxt 

chương trình bạn đã đọc số đầu tiên argv[1] và đối xử với nó như tên của tệp cần mở. Để có chương trình đọc đầu vào người sử dụng, làm một cái gì đó như thế này:

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

Sau đó, tên file sẽ được ở str, thay vì argv[1].

+0

Ah! Bạn đã đúng, tôi đã trộn chúng lên. Chúc mừng cho thanh toán bù trừ mà lên! – TylarBen