2010-06-14 43 views
5

Giả sử có một tập tin gọi là 12345.jpg. Trong C, làm thế nào tôi có thể nhận được phần mở rộng tập tin để tôi có thể so sánh với một số phần mở rộng tập tin? Nếu có bất kỳ chức năng sẵn có nào, vui lòng cho tôi biết.Tải phần mở rộng tập tin bằng ngôn ngữ C

+0

[SO 290488] (http://stackoverflow.com/questions/290488) bao gồm rất nhiều nền tảng giống nhau. –

+0

Vậy là thế này - http://stackoverflow.com/questions/51949/how-to-get-file-extension-from-string-in-c –

+0

Bản sao có thể có của [Nhận phần mở rộng tệp trong C] (http: // stackoverflow.com/questions/5309471/getting-file-extension-in-c) – nibot

Trả lời

5

lẽ:

#include <string.h> 

char *extn = strrchr(filename, '.'); 

Điều đó sẽ cung cấp cho bạn một con trỏ đến giai đoạn mở rộng, hoặc một con trỏ null nếu không có phần mở rộng. Bạn có thể cần phải làm một số sự thẩm định hơn để đảm bảo rằng không có dấu gạch chéo sau dấu chấm, trong số những thứ khác.

+3

'strrchr (tên tập tin + 1, '.');' sẽ xử lý các tên như '.svn' bắt đầu bằng dấu chấm nhưng không có phần mở rộng. – drawnonward

+0

@drawnonward - chắc chắn, nếu bạn cho rằng đó là một tên tệp không có phần mở rộng, chứ không phải là phần mở rộng không có tên. Đó là một trường hợp “thẩm định” khác cần được xem xét. Tuy nhiên, nếu OP đang tìm kiếm để so sánh phần mở rộng tìm thấy với một danh sách khá ngắn các phần mở rộng đã biết, thì thực tế là '.svn' không có trong danh sách có nghĩa là nó có thể sẽ không quan trọng. –

+0

@drawnonward: Tôi đã đọc sai những gì bạn đang nói - bạn tạo một điểm hợp lệ. Tuy nhiên, điều đó sẽ không giúp ích với các tên đường dẫn tuyệt đối bắt đầu bằng một '/', hoặc tên tương đối có chứa dấu gạch chéo ('subdir/.svn'). Có một trường hợp để nói rằng bạn cần tìm đầu của tên tập tin (sau dấu gạch chéo cuối cùng, nhưng bạn phải lo lắng về dấu gạch chéo và gốc) và sau đó tìm dấu chấm ở vị trí đầu tiên. Tôi đoán điều đó có nghĩa là thư mục mẹ '..' có tên 'dấu chấm', theo sau là phần mở rộng bắt đầu bằng dấu chấm và không có gì khác ... Thường có một quả bóng cong khác để xử lý. –

-1

Sử dụng strchr viên mảng đầu tiên sẽ cung cấp cho bạn filename viên mảng thứ hai sẽ cung cấp cho bạn mở rộng

+0

Bạn có thể giải thích về điều này không? –

+0

Đừng quên tên tệp như 'this.uses.many.periods.jpg' –

8

Một chức năng để làm điều đó, cùng với một khai thác thử nghiệm:

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

const char *getExt (const char *fspec) { 
    char *e = strrchr (fspec, '.'); 
    if (e == NULL) 
     e = ""; // fast method, could also use &(fspec[strlen(fspec)]). 
    return e; 
} 

int main (int argc, char *argv[]) { 
    int i; 
    for (i = 1; i < argc; i++) { 
     printf ("[%s] - > [%s]\n", argv[i], getExt (argv[i])); 
    } 
    return 0; 
} 

Chạy này với:

./program abc abc. abc.1 .xyz abc.def abc.def.ghi 

cung cấp cho bạn:

[abc] - > [] 
[abc.] - > [.] 
[abc.1] - > [.1] 
[.xyz] - > [.xyz] 
[abc.def] - > [.def] 
[abc.def.ghi] - > [.ghi] 
+0

+1 cho' strrchr'. Phương pháp tốt nhất để tìm phiên bản cuối cùng của một ký tự trong một chuỗi. – tomlogic

+0

Chỉ trong trường hợp bất cứ ai bỏ lỡ nó. 'getExt()' giả định rằng 'fspec' là một tên cơ sở, không phải là đường dẫn đầy đủ. Hãy xem xét ví dụ: 'my.dir/file'. Sử dụng 'basename()' để lấy tên cơ sở từ một đường dẫn đầy đủ. –

2

Có giải pháp CRT di động: _splitpath.

Trong cửa sổ cũng có API shell32 không có giấy tờ được gọi là PathGetExtension, nhưng đó là điều xấu xa theo nhiều cách mà tôi có lẽ không nên lưu ý.

+6

Điều này rõ ràng là một số định nghĩa mới của từ "di động" mà trước đó tôi không biết :-) Với lời xin lỗi Douglas Adams của HHGTTG ​​nổi tiếng. – paxdiablo

+4

Thật vậy, không bao giờ nhìn thấy từ "di động" và một liên kết đến msdn trong cùng một câu :-) – Job

+2

xấu của tôi, xấu của tôi! Sẽ không chỉnh sửa câu trả lời, để người khác thưởng thức :) –

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