2012-12-11 39 views
5

Tôi cần phải tạo một tệp tạm thời trong chương trình C, viết một số dữ liệu vào nó, rồi gọi lệnh bên ngoài (qua exec hoặc hệ thống) để thực hiện một số xử lý trên tệp mà tôi vừa tạo. Tôi đã không viết lệnh bên ngoài và cũng không khả thi để tích hợp nó vào chương trình của tôi vì vậy tôi không nghĩ rằng tôi có thể chia sẻ một bộ mô tả đã mở với nó. Vì vậy, tôi cần phải biết tên của tập tin tạm thời được tạo ra.Làm cách nào để mở tệp tạm thời VÀ nhận tên tệp của nó?

Chức năng tempname() thực hiện điều này, nhưng tiếc là nó khuyến cáo bạn không sử dụng chính nó, do điều kiện chủng tộc có thể giữa tên và mở tệp và không có chức năng nào đề xuất (tmpfile và mkstemp)) cung cấp một cách để tìm ra tên thực của tệp được tạo.

+2

'mkstemp' trả về tên; nó sẽ sửa đổi đối số mẫu được truyền vào (mà là một char *, không phải là một ký tự const *) thay thế giá trị X bằng các giá trị thực tế. – Joe

Trả lời

5

Nó không phải là sự thật rằng mkstemp không cho phép bạn biết tên tập tin tạm thời, cố gắng để biên dịch và thực thi chương trình này để xem bản thân:

#include <stdlib.h> 
#include <stdio.h> 

int main() 
{ 
    char fn[] = "/tmp/fileXXXXXX"; 
    int fd = mkstemp(fn); 
    char cmd[200]; 
    int n = snprintf(cmd, sizeof(cmd), "ls -l %s\n", fn); 

    printf("snprintf=>%d\n sizeof(fn)=%d\n", n, sizeof(fn)); // extra info, see comments 

    printf("%s\n", cmd); 
    return system(cmd); 
} 

mkstemp sẽ thay thế các mẫu tên tập tin trong bộ đệm bạn vượt qua với nó với tên tập tin thực tế, bạn có thể làm bất cứ điều gì bạn muốn với bộ đệm này sau này.

+0

Ah, đúng vậy. Không chắc chắn làm thế nào tôi bỏ lỡ mà đọc trang người đàn ông. Cảm ơn! – Michael

+0

Nhận thấy rằng nếu tôi vượt qua một chuỗi được giao như bạn đã làm ở trên tôi nhận được một segfault trong __gen_tempname. Nếu tôi strdup nó, sau đó tôi không. Điều này có thể phụ thuộc vào nền tảng, nhưng tôi đoán rằng trong một số trường hợp, hằng số chuỗi được đặt trong phân đoạn chỉ đọc. – Michael

+1

@Michael Tôi tin rằng mã là OK. Lưu ý rằng, tôi đã không khai báo 'fn' như một con trỏ tới' char'. Nó thực sự là một mảng nội bộ (nó trên stack) được khởi tạo với dữ liệu chuỗi ký tự. – piokuc

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