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
Trả lời
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.
'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
@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. –
@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ý. –
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
Bạn có thể giải thích về điều này không? –
Đừng quên tên tệp như 'this.uses.many.periods.jpg' –
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]
+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
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 đủ. –
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 ý.
Đ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
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
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 :) –
- 1. Mở rộng ngôn ngữ C#?
- 2. Thêm phần mở rộng tập tin vào tập tin mở rộng ít hơn
- 3. Lấy phần mở rộng tập tin (basename?)
- 4. Ngôn ngữ nào sử dụng phần mở rộng .pde?
- 5. Cách tìm phần mở rộng của một tập tin?
- 6. Ngôn ngữ nào để viết các mở rộng vỏ windows
- 7. Tải ImageFormat từ Tiện ích mở rộng Tập tin
- 8. Viết phần mở rộng Emacs bằng các ngôn ngữ khác ngoài Lisp
- 9. Batch: Hủy bỏ phần mở rộng tập tin
- 10. Mở rộng tập tin kiểm tra PHP
- 11. Get Tên tập tin Nếu không mở rộng bằng Python
- 12. Xóa thư mục con và phần mở rộng tập tin
- 13. Regex để có được phần mở rộng tập tin
- 14. Hủy bỏ phần mở rộng của một tập tin
- 15. asp.net mvc HttpPostedFileBase nhận phần mở rộng tập tin
- 16. Tải phần mở rộng của một tập tin chứa trong NSString
- 17. Có thể tải phần mở rộng tập tin mà không biết?
- 18. Loại bỏ .php phần mở rộng tập tin với tập tin .htaccess
- 19. Codeigniter nhiều tập tin tải lên messes mở rộng tập tin
- 20. PHP tập tin liệt kê nhiều phần mở rộng tập tin
- 21. Lưu tập tin bằng ứng dụng mac - mở rộng tập tin
- 22. ms mở rộng tập tin văn phòng
- 23. Nhận dạng một tập tin bằng tiếng shebang và không có phần mở rộng
- 24. Phần nào của ngôn ngữ C# là .ForEach()?
- 25. Thư viện và tiện ích mở rộng Ngôn ngữ
- 26. Emacs C++, mở tương ứng với phần đầu tập tin
- 27. Haskell FlexibleCó phải là phần mở rộng ổn định cho ngôn ngữ không?
- 28. Mã nguồn của phần mở rộng ngôn ngữ của GHC ở đâu: "Mũi tên"?
- 29. Buộc đóng một tập tin mở bằng C#
- 30. Codeigniter Thay đổi ngôn ngữ đã tải
[SO 290488] (http://stackoverflow.com/questions/290488) bao gồm rất nhiều nền tảng giống nhau. –
Vậy là thế này - http://stackoverflow.com/questions/51949/how-to-get-file-extension-from-string-in-c –
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