【发布时间】:2014-12-08 15:05:52
【问题描述】:
我正在尝试编写一个函数来确定目录中的文件是否具有 gif/bmp/png/jpg 扩展名。现在我想我已经正确地编写了我的代码,直到列出目录中的文件并以二进制模式打开它们。
现在,我正在努力弄清楚如何确定图像的扩展名。现在我只专注于写我的“bool isGif();”函数... 要使用二进制确定文件是否为 .gif 扩展名,文件的前 6 个字节将包含 GIF87a 或 GIF89a。所以,要做到这一点,我会将文件的前六个字节读入一个数组,然后将它们与包含“GIF87a”或“GIF89a”的数组进行比较,对吗?
以下是我编写此代码的尝试。它给了我 2 个警告,但没有错误,它在程序中运行良好,但它从不输出目录包含 gif 的消息,我知道它确实如此,因为我把它放在那里......
getDir();
ifstream fin;
_finddata_t a_file;
intptr_t dir_handle;
dir_handle = _findfirst("*.*", &a_file);
//if (dir_handle == -1)
//{
//return;
//}
while (_findnext(dir_handle, &a_file) == 0);
{
fin.open(a_file.name, ios::in | ios::binary);
if (!fin)
{
cout << endl << "Could not open the file."
<< " Attempting to open the next file." << endl;
return false;
}
else
{
cout << "Files opened successfully."
<< " Processing through the directory." << endl;
ifstream fl(a_file.name);
fl.seekg(0, ios::end);
size_t len = fl.tellg();
char *ret = new char[len];
fl.seekg(0, ios::beg);
fl.read(ret, len);
fl.close();
char arr1[6] = { 'G', 'I', 'F', 8, 7, 'a' };
char arr2[6] = { 'G', 'I', 'F', 8, 9, 'a' };
if (ret == arr1 || arr2 )
{
cout << a_file.name << " has a .gif extension" << endl;
return true;
}
}
}
好的,我想我现在已经接近了...这是对这个问题很重要的代码的更新/更改的 sn-p...我只是尝试使用 for 循环来读取前 6 个字节到一个字符串,所以我可以比较这些位以确定它是否是一个 gif,但我无法将字节输入到一个字符串中。
int i;
int comp1, comp2;
for (i = 0; i != 6; i++)
{
string gifStr;
fin.read((char*)&a_file, i);
gifStr(&a_file, i);
}
string gifStr1 = "GIF87a";
string gifStr2 = "GIF89a";
comp1 = strcmp( , gifStr1);
if (comp1 == 0)
{
cout << a_file.name << " has a .gif extension" << endl;
}
comp2 = strcmp( , gifStr2);
if (comp2 == 0)
{
cout << a_file.name << " has a .gif extension" << endl;
}
对不起,这个网站让我对回复和类似的事情有点困惑......哈哈。
【问题讨论】:
-
一般情况下是不可能的。您需要扫描幻数签名。
-
怎么不可能?您不能将单个字节读入一个数组,然后将这些字节与另一个字符数组进行比较,看看它们是否相等?这是一个 CSC 250 类的作业,所以它应该不会有太难的解决方案。
-
"... 所以应该不会有太难的解决方案" 那么祝你好运:-P ...
-
无关:您认为您需要打开该文件多少次?我认为一次就足够了。
-
您的代码泄漏内存,
ret == arr1不比较数组的文本内容。使用标准::字符串。不要将 strcmp 与 std::string 一起使用,使用 operator ==
标签: c++ image file visual-studio-2013 binary