所以我的目标是使用visual C ++ lang创建一个控制台应用程序,它打开一个文件(在我的例子中是一个MIME文件)并找到一个特定的字符串。在我的情况下,它听起来 - 内容 - 处置:附件;文件名=" file.smth&#34 ;. 然后该应用程序显示file.smth 所以这就是我所做的。它有一些我无法找到的问题。当我运行一个控制台应用程序它被困在找到一个文件名。
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
bool ShowFile(char * FileName, char * Name)
{
FILE* file;
if (fopen_s(&file, FileName, "rt") != 0) { return false; }
while (!feof(file))
{
char AttName[100];
int a = sscanf_s("Content-Disposition: attachment; filename=\"%[^\"]\"", AttName,_countof(AttName));
Name = AttName;
}
fclose(file);
return true;
}
int main(int argc, char* argv[])
{
char FileName[100];
if (argc == 2) strcpy_s(FileName, _countof(FileName), argv[1]);
else {
printf("Source file name: "); gets_s(FileName, _countof(FileName));
}
char Name[100];
ShowFile(FileName, Name);
printf("%s \n", Name);
system("pause");
return 0;
}
感谢您的关注!
答案 0 :(得分:0)
可以改进函数ShowFile
。
建议1
如果您希望函数通过第二个参数返回文件名(file.smth
),请将其更改为std::string&
。
//bool ShowFile(char * FileName, char * Name)
bool ShowFile(char * FileName, std::string& Name)
正如函数现在所示,您正在将函数中的Name
更改为指向局部变量。但这对调用函数没有影响。这条线
Name = AttName;
完全没用。
建议2
您尚未添加任何代码来从文件中读取数据。这条线
int a = sscanf_s("Content-Disposition: attachment; filename=\"%[^\"]\"", AttName,_countof(AttName));
将格式规范作为第一个参数,而不是从中读取数据的字符串。它缺少源字符串。
您需要添加代码来读取文本行,并尝试从这些行中提取AttName
。
建议3
请勿使用while (!feof(file))
。请参阅Why is “while ( !feof (file) )” always wrong?。
您需要以下内容:
char line[200];
while ( fgets(line, sizeof(line), file) )
{
char AttName[100];
int a = sscanf_s(line, "Content-Disposition: attachment; filename=\"%[^\"]\"", AttName,_countof(AttName));
...
}
建议4
始终检查scanf
函数族的返回值,以确保该函数能够将数据分配给变量。不要以为它成功了。
int a = sscanf_s(line, "Content-Disposition: attachment; filename=\"%[^\"]\"", AttName,_countof(AttName));
// Name = AttName;
if ( a == 1 )
{
Name = AttName;
}
建议5
添加一个标志,表示Name
已成功读取。
修改功能
bool ShowFile(char * FileName, std::string& Name)
{
bool status = false;
FILE* file;
if (fopen_s(&file, FileName, "rt") != 0) { return false; }
char line[200];
while (fgets(line, sizeof(line), file))
{
char AttName[100];
int a = sscanf_s(line, "Content-Disposition: attachment; filename=\"%[^\"]\"", AttName,_countof(AttName));
if ( a == 1 )
{
Name = AttName;
// Got what we are looking for.
// Set the status and break out of the loop.
// There is no need to look for Name any more.
status = true;
break;
}
}
fclose(file);
return status;
}