2009-12-11 75 views
6

Trong chương trình C, chức năng này sẽ xử lý tất cả công việc mở một tệp cụ thể và sau đó trả về con trỏ tệp, vì vậy các hàm chính hoặc hàm khác có thể đọc nội dung bằng cách sử dụng fp, không thể làm được điều này.Trả về con trỏ từ hàm C

Tôi chỉ đang học ngôn ngữ, vì vậy có thể tôi đang làm điều gì đó rất sai.

int open_text_file(char text_file_name[]) 
{ 
    FILE *fp; 

    if((fp = fopen(text_file_name, "r")) != 0) 
    { 
      return fp; 
    } 

    else 
    { 
      printf("Cannot open file \"%s\"\n", text_file_name); 
    } 
} 
+1

Bạn đang cố trả về con trỏ tới cấu trúc 'FILE' dưới dạng' int'. Bạn đang thấy cái gì (ngoài lỗi đó)? –

+1

Là vấn đề về kiểu mã hóa, bạn nên so sánh 'fp' với' NULL' thay vì '0'. Nếu cũng có thể rõ ràng hơn để tách nhiệm vụ và so sánh 'fp' thành các câu lệnh riêng biệt. –

Trả lời

11

Trong dòng đầu tiên, bạn có

int open_text_file(char text_file_name[]) 

này tuyên bố kiểu trả về như một int Những gì bạn cần có là

FILE * open_text_file(char text_file_name[]) 

Đồng thời, trong "khác" trường hợp, bạn nên trả lại một cái gì đó để chỉ ra một lỗi cho người gọi.

return NULL 

là lựa chọn thích hợp. Hãy chắc chắn rằng bạn kiểm tra giá trị trả lại của bạn khi bạn gọi nó, mặc dù.

+0

Tuyệt vời, bây giờ tôi có thể chuyển argv [1] đến hàm và in nội dung từ chính. Như nhiều người trong số các bạn nói, tôi nên so sánh fp với NULL, tại sao? – KJ0090

+0

Trên một số nền tảng không phổ biến, NULL có thể không bằng 0. Tuy nhiên, điều này không đúng trong C++ hoặc hầu hết các địa điểm trong thực tế. – McPherrinM

0

FILE* open_text_file(); cần phải là nguyên mẫu.

An int không phải là FILE*.

6

Hàm này hơi vô nghĩa, vì tất cả những gì nó làm là fopen(), cộng với thông báo lỗi. Đây không phải là thiết kế tốt, vì nhánh lỗi cũng phải trả về một con trỏ (có lẽ là NULL), mà sau đó phải được kiểm tra lại trong mã gọi. Tốt hơn là chỉ cần nói:

FILE * fp = fopen(somefile, "r"); 
if (fp == NULL) { 
    fprintf(stderr, "Cannot open %s\n", somefile); 
    exit(1); // or whatever you need to do to handle the error 
} 
+0

+1, Chức năng này thực sự vô nghĩa. –

Các vấn đề liên quan