C或者C++判断文件的类型。

我现在又个程序,是基于MFC的,我用CfileDialog需要打开一个文本文件,但是如果打开的不是文本文件那么应该提示出错。我应该用什么函数来实现该判断呢。或者算法什么的... 我现在又个程序,是基于MFC的,我用CfileDialog需要打开一个文本文件,但是如果打开的不是文本文件那么应该提示出错。我应该用什么函数来实现该判断呢。或者算法什么的! 展开
 我来答
金鱼8884
2015-10-29 · 知道合伙人数码行家
金鱼8884
知道合伙人数码行家
采纳数:124 获赞数:14950
学生

向TA提问 私信TA
展开全部
其实之所以要使用文件类型,只是为了方便软件认识,让后进行关联。它不是必要的。

比如说 *.doc 文件,默认关联的程序是 Microsoft Word 。关联程序的意思是,你双击这个文件,会自动用 Microsoft Word 打开它。

但这只是默认的,可以通过下面的步骤来修改打开 *.doc 文件的默认程序:
【在文件上右击-打开方式-选择程序,选择一个软件】,比如说金山的 wps。
那么下次你双击 *.doc 文件,就是用金山 wps 打开了。

综上所述,一种类型的文件,是可以用多种软件打开的(*.doc 可以用 WORD 打开,也可以用 WPS 打开,当然还可以用其他程序打开,这要它能识别文件的格式。)。加上文件类型,可以让程序方便的找到自己能识别的文件。当然,没有文件类型,文件的内容(一串二进制数字)其实是一样的,程序还是能打开的。

比如说有个文件叫 a.doc,你双击它,默认会用 Microsoft Word 打开。

把它重命名为 a (注意没有文件类型后缀),双击打,操作系统就【不知道】怎么打开这个文件了。
这时候,操作系统会跳出一个对话框,让你选择打开这个文件的程序。如果选择了 Microsoft Word ,还是可以正常打开这个文件的。
但是,这样就很麻烦了,你每次都要在一大堆程序的列表中,选择用一个程序才能打开文件 a。

这才是文件类型真正的作用。

---------------------------------------------------------------------------------------------------------

.doc 文件类型:Microsoft Word 文档(因为 *.doc 类型是 Microsoft 首先定义,才这么叫的)
.xlsx 文件类型:Microsoft Excel 工作(同 *.doc)
.pptx 文件类型:Microsoft PowerPoint 演示文稿(同 *.doc)

现在一般这么叫的:

.doc 文件类型:Word 文档
.xlsx 文件类型:Excel 工作
.pptx 文件类型:PowerPoint 演示文稿

区别就是去掉了公司名字 “Microsoft ”,因为这些文件类型以及很成熟了,很多公司都开发出了能打开这些类型文件的应用程序了,再加上 "Microsoft " 的名字就不合适了。
---------------------------------------------------------------------------------------------------------

上面都是废话,下面是提取文件类型的小程序:

#include <stdio.h>
#include <string.h>
char * getType(char fileName[], char type[])
{
int i=strlen(fileName)-1, j;
char ch;

for(type[0]='\0';i>=0;i--)
{
if(fileName[i] == '.')
{// 遇到文件类型分隔符
for(j=i; fileName[j]!='\0'; j++)
{
ch = fileName[j];
type[j-i] = ('A'<=ch && ch<='Z') ? (ch+'a'-'A'): ch;
}

type[j-i] = '\0';
break;
}
else if(fileName[i] == '/' || fileName[i]=='\\')
{// 遇到目录分割符,退出
break;
}
}

return type;
}
char * getTypeName(char type[], char typeName[])
{
if(strcmp(".doc", type) == 0)
strcpy(typeName, "WORD 文档");

else if(strcmp(".xlsx", type) == 0)
strcpy(typeName, "Excel 工作表");

else if(strcmp(".pptx ", type) == 0)
strcpy(typeName, "PowerPoint 演示文稿");

else if(strcmp(".txt", type) == 0)
strcpy(typeName, "文本文档");

else
strcpy(typeName, "其他类型文档");
}
int main(int argc, char *argv[])
{

char fileName[300];
char type[10];
char typeName[100];
// 输入文件名,可以包含多层目录路径,可以含空格,按 ctrl + z 停止输入
while(gets(fileName)!=NULL)
{
getType(fileName, type);
getTypeName(type, typeName);

printf("file:[%s] type is [%s,%s]\n", fileName, type, typeName);
}
return 0;
}

/*
aa.DOC
bb.xlsx
cc.PPPTS
dd.txt
ee.zzz
*/
镭毅
推荐于2018-03-14 · TA获得超过1394个赞
知道大有可为答主
回答量:1155
采纳率:0%
帮助的人:1093万
展开全部
多数文件都有一个fileheader,即文件头,里面包含文件类型的信息。
但文本文件比较简单。只能通过文件名后缀判断;
cfiledialog中有一个过滤器,filter函数,可以判断后缀(.txt)。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
秋水静轩
推荐于2016-02-29 · 知道合伙人软件行家
秋水静轩
知道合伙人软件行家
采纳数:206 获赞数:585
就读于西北农林科技大学--信息工程学院--软件工程专业,对软件开发、网页设计有较专业的知识。

向TA提问 私信TA
展开全部
#include <stdio.h>
#include <string.h>
char * getType(char fileName[], char type[])
{
int i=strlen(fileName)-1, j;
char ch;

for(type[0]='\0';i>=0;i--)
{
if(fileName[i] == '.')
{// 遇到文件类型分隔符
for(j=i; fileName[j]!='\0'; j++)
{
ch = fileName[j];
type[j-i] = ('A'<=ch && ch<='Z') ? (ch+'a'-'A'): ch;
}

type[j-i] = '\0';
break;
}
else if(fileName[i] == '/' || fileName[i]=='\\')
{// 遇到目录分割符,退出
break;
}
}

return type;
}
char * getTypeName(char type[], char typeName[])
{
if(strcmp(".doc", type) == 0)
strcpy(typeName, "WORD 文档");

else if(strcmp(".xlsx", type) == 0)
strcpy(typeName, "Excel 工作表");

else if(strcmp(".pptx ", type) == 0)
strcpy(typeName, "PowerPoint 演示文稿");

else if(strcmp(".txt", type) == 0)
strcpy(typeName, "文本文档");

else
strcpy(typeName, "其他类型文档");
}
int main(int argc, char *argv[])
{

char fileName[300];
char type[10];
char typeName[100];
// 输入文件名,可以包含多层目录路径,可以含空格,按 ctrl + z 停止输入
while(gets(fileName)!=NULL)
{
getType(fileName, type);
getTypeName(type, typeName);

printf("file:[%s] type is [%s,%s]\n", fileName, type, typeName);
}
return 0;
}

/*
aa.DOC
bb.xlsx
cc.PPPTS
dd.txt
ee.zzz
*/
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
侍夜南5j
2012-07-27 · 超过15用户采纳过TA的回答
知道答主
回答量:29
采纳率:0%
帮助的人:43.1万
展开全部
如果你是想只打开文本文件的话,只要在CFileDialog的过滤器中只添加文本文件类型就行(*.txt等文本类型)。
如果你是想实现选错文件时提示出错功能,可以用文件后缀判断,在CFileDialog窗口选择文件点确定后,通过CFileDialog成员函数获得文件完整路径(其中包括文件名),然后截取后缀同过字符串判断是否为文本文件
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友02d2007
2012-07-27 · TA获得超过140个赞
知道小有建树答主
回答量:196
采纳率:100%
帮助的人:110万
展开全部
使用系统调用的函数,先获取该文件的文件名,然后判断“.”后面的文件类型,如果是文本文件就打开,如果是其他文件则报错,那个函数好像是stat的什么的,很久没用,忘记了,最后返回一个结构体类型,结构体内的其中一个成员就是文件名。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式