2014-10-03 27 views
5

Tôi đã tìm kiếm trên diễn đàn và không thể tìm thấy câu trả lời cho vấn đề này. Nó có vẻ là phổ biến, nhưng không ai trong số các bản sửa lỗi được đề cập được áp dụng.fopen trả về đối số không hợp lệ trong C

Đây là mã của tôi để mở một tập tin:

#include <stdio.h> 
#include <string.h> 

void main() { 
    FILE *input; 
    char path[200]; 

    printf("Enter the full file path and file name in the following format:" 
     "\nC:\\Users\\Username\\etc......\\filename.extension\n"); 
    fgets(path, 200, stdin); 
    printf("%s",path); 
    input=fopen(path,"r"); 
    if (input==NULL) { 
     perror("The following errors were encountered"); 
     return(-1); 
    } 
} 

printf(%s,path) đúng sẽ hiển thị đường dẫn và tên của tập tin tôi muốn mở, nhưng fopen luôn trả về tham số không hợp lệ. Tôi cũng đã thử sử dụng một con trỏ đến đường dẫn trong fopen, nhưng điều này luôn luôn treo chương trình.

+9

Điều này là do 'đường dẫn' sẽ chứa một ký tự dòng mới ... – isedev

+0

BTW:' void main' là xấu, sử dụng 'int main' thay thế. Ngoài ra, 'return' không phải là một hàm, và do đó cần n dấu ngoặc đơn xung quanh đối số của nó. – Deduplicator

+5

Lưu ý phụ: bạn trả về giá trị '-1' khi chính được khai báo là void. Đừng làm thế. Khai báo chính là int và trả về một cái gì đó từ tất cả các đường dẫn mã. Trong khi đó không phải là lỗi phá vỡ, đó là phong cách xấu. – jpw

Trả lời

6

Bạn đang nhận được path với fgets. \n được coi là ký tự hợp lệ theo fgets. Bạn cần phải loại bỏ nó bằng tay.

fgets(path, 200, stdin); 
path[strlen(path) - 1] = '\0'; 
+0

Điều này có thể không đủ; 'fgets' có thể trả về một dòng' \ r \ n' đã kết thúc (nó không được yêu cầu, nhưng một số thư viện C cũ vẫn làm) hoặc người dùng có thể vô tình gõ dấu cách. – zwol

+1

'đường dẫn [strlen (đường dẫn) - 1]' –

+1

@Zack Hoặc nó có thể trả về 'NULL', để chỉ báo lỗi. – Deduplicator

5

Vấn đề của bạn là lẽ rằng fgets không loại bỏ các dấu '\n' từ dòng đầu vào trước khi trở về nó. fopen vui vẻ cố mở một tệp có tên là '\n', nhưng (giả sử, như mã của bạn đề xuất, bạn đang sử dụng Windows) hệ điều hành không cho phép tên tệp chứa ký tự đó, đó là lý do bạn nhận được "Đối số không hợp lệ " thông điệp. Trên một hệ thống kiểu Unix, nơi mà hạt nhân áp đặt các ràng buộc ít hơn nhiều đối với tên tệp, bạn sẽ thay vào đó nhận được "Không có tệp hoặc thư mục như vậy". Đây có thể là lý do tại sao bạn không tìm thấy bất kỳ câu trả lời nào trước đây cho câu hỏi này; Tôi biết tôi đã thấy các biến thể trước đây.

Hãy thử điều này:

... 
fgets(path, 200, stdin); 
char *p = path + strlen(path) - 1; 
while (isspace(*p)) p--; 
*(p+1) = '\0'; 
printf("%s\n", path); 
input = fopen(path, "r"); 
... 

Bạn sẽ cần #include <ctype.h> cho isspace.

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