2012-02-02 40 views
7

Tôi đang cố chuyển một đường dẫn tương đối đến fopen(), nhưng dường như không tìm thấy tệp đó. Tôi cần điều này để làm việc trên Linux. Tên tập tin (ví dụ: t1.txt) được lưu trong một mảng. Vì vậy, tất cả những gì tôi cần là "phần phía trước" của một con đường tương đối.Vượt qua một đường dẫn tương đối đến fopen()

Dưới đây là mã của tôi:

// Use strcat to create a relative file path 
char path[] = "./textfiles/"; // The "front part" of a relative path 
strcat(path, array[0]); // array[0] = t1.txt 

// Open the file 
FILE *in; 
in = fopen("path", " r "); 
if (!in1) 
{ 
    printf("Failed to open text file\n"); 
    exit(1); 
} 

Trả lời

6
in = fopen("path", " r "); 

Hai sai lầm ngay:

  1. Bạn không muốn để mở các tập tin theo nghĩa đen có tên là "con đường", bạn muốn tập tin có tên trong biến path
  2. đối số chế độ không hợp lệ; bạn muốn "r"

Để có được chúng ngay làm

in = fopen(path, "r"); 
+0

oh wow, haha! sẽ không bao giờ bị lỗi đầu tiên bởi chính tôi. Và yea, tôi thích thêm không gian để mã trông không đông đúc. Đoán đó là một ý tưởng tồi! Dù sao, cảm ơn bạn! – Dino55

+0

Đừng quên các đề xuất trong các câu trả lời khác, cụ thể là kích thước của mảng 'đường dẫn' và không kiểm tra' in1' khi 'FILE *' của bạn là 'in'. – pmg

5

Trước tiên, bạn cần phải thêm một số không gian để path để phù hợp với nội dung của array[0] trong strcat, nếu không bạn sẽ được viết qua khu vực được giao.

Thứ hai, bạn không vượt qua path đến fopen, vì bạn đã đính kèm "path" bằng dấu ngoặc kép.

char path[100] = "./textfiles/"; // Added some space for array[0] 
strcat(path, array[0]); 

// Open the file 
FILE *in; 
in = fopen(path, " r "); // removed quotes around "path" 
if (!in) 
{ 
    printf("Failed to open text file\n"); 
    exit(1); 
} 
+0

Tôi hiểu. Cảm ơn bạn! – Dino55

+0

Tôi nghĩ bạn muốn nói 'strcat (path, argv [1])', vì 'argv [0]' là tên của chương trình hiện tại. – markgz

+0

@markgz Cảm ơn! Trên thực tế, tôi có nghĩa là để nói 'mảng [0]' để làm theo mã của OP, nhưng intellisense đặt argv, và tôi đã không thông báo. Điều này hiện đã được sửa. – dasblinkenlight

2

Vấn đề của bạn không có gì để làm với fopen và tất cả mọi thứ với xử lý C chuỗi: strcat đòi hỏi đủ bộ nhớ trong bộ đệm đích cho toàn bộ chuỗi, nhưng bạn chỉ cung cấp đủ bộ nhớ cho chuỗi ban đầu. Xấu! Sử dụng các công cụ như valgrind sẽ cho bạn biết về truy cập bất hợp pháp của bạn ngay lập tức, bằng cách này.

Dưới đây là một giải pháp ngây thơ:

char buf[1000] = { }; 
strcat(buf, "./textfiles/"); 
strcat(buf, array[0]); 

// ... 
+0

Cảm ơn bạn! nó hoạt động bây giờ :) – Dino55

2

path chỉ đủ lớn để chứa các ký tự nó đã được khởi tạo với. Kích thước của path phải được tăng lên. Phân bổ bộ nhớ cho path dựa trên tên tệp được thêm vào:

const char* dir = "./textfiles/"; 
const size_t path_size = strlen(dir) + strlen(array[0]) + 1; 
char* path = malloc(path_size); 
if (path) 
{ 
    snprintf(path, path_size, "%s%s", dir, array[0]); 

    in = fopen(path, "r"): /* Slight differences to your invocation. */ 

    free(path); 
} 
+0

tôi đã không nghĩ về điều đó cả. Cảm ơn vi đa trả lơi! – Dino55

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