2010-09-07 16 views
5
#include<stdio.h> 

int main() { 

    FILE* fp; 
    fp = fopen("temp.txt", "w"); 
    fprintf(fp, "Hello, World!\n"); 

    // remove("temp.txt"); this requires the filename as an argument 
    // removefile(fp);  <--- is something like this possible? 

    return 0; 
} 

Chức năng xóa (defined in stdio.h) lấy tên tệp làm tham số chứ không phải là chính con trỏ tệp.Làm cách nào để xóa tệp được trỏ bởi FILE * trong C?

Có một số chức năng trong thư viện chuẩn C không thực hiện xóa tệp và lấy con trỏ tệp làm tranh luận không?

Trả lời

1

Không, không có (không may).

7

Tôi không tin rằng có bất kỳ cách nào để làm điều này, bởi vì một FILE * có thể không nhất thiết phải tương ứng với một tập tin trong hệ thống tập tin ở tất cả (Ví dụ, stdin và stdout).

Và trong các hệ thống tệp hỗ trợ liên kết cứng, có thể có nhiều đường dẫn đề cập đến cùng một tệp cơ bản, bạn muốn loại bỏ đường dẫn nào?

1

Không, bạn không thể. Và cấu trúc FILE không bao gồm tên tệp bên trong. Vì vậy, lựa chọn tốt nhất là có cấu trúc mà cả hai sẽ giữ con trỏ đến FILEchar* với tên

1

Bạn đóng con trỏ, sau đó giá trị của nó được giải phóng, bạn tưởng tượng xóa tệp bằng tay cầm này như thế nào?

+0

trong khi ý tưởng của bạn là chính xác, nó không được đặt thành NULL trong mẫu. – Andrey

+0

@Audrey: 'Đóng tệp được liên kết với luồng và hủy liên kết tệp đó.' – Svisstack

+0

hiệu chỉnh, nó không được đặt thành rỗng. Đó là một điểm để giải phóng bộ nhớ, và tiềm năng cho một segv/gpf. Trong thực tế, bạn nên thêm một dòng 'fp = 0' ngay sau fclose(). – vrdhn

7

Bạn có thể muốn sử dụng hàm 'FILE * tmpfile (void)' từ stdlib.

từ người đàn ông:

MÔ TẢ

Các tmpfile() chức năng có trách nhiệm tạo ra một tập tin tạm thời và mở một dòng tương ứng. Tệp sẽ tự động xóa khi tất cả các tham chiếu vào tệp được đóng lại. Các tập tin được mở như trong fopen() cho cập nhật (w +).

Trong một số triển khai, tệp vĩnh viễn có thể bị bỏ lại nếu quá trình gọi tmpfile() bị giết trong khi đang xử lý lệnh gọi tới tmpfile().

Thông báo lỗi có thể được ghi vào lỗi chuẩn nếu luồng không thể mở được .

+1

Cơ chế này hoạt động như thế nào bên trong (tôi có nghĩa là thực hiện phương pháp tmpfile)? –

+0

Bạn luôn có mã nguồn của std-lib để xem ... trên posix, người ta có thể mở một tệp và hủy liên kết ngay lập tức và tệp mở sẽ tiếp tục có thể sử dụng được. Tôi tự hỏi nó hoạt động như thế nào trên Windwows! Ngoài ra .. điểm mà tập tin có thể được để lại trong trường hợp quá trình là giết chết đột ngột .. dường như ngụ ý atexit() tại nơi làm việc – vrdhn

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