C ++在文件中查找包含名称的特定字符串

时间:2015-11-25 19:55:01

标签: c++ visual-c++

所以我的目标是使用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;
}    

感谢您的关注!

1 个答案:

答案 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;
}