0

我目前正在开展一个需要评估神秘文本文件的项目,并使用提供给我的签名交叉引用它们。我面临的一个问题是我们已经从项目文件夹中的文件夹中读取文件。(我使用的是 Visual Studios 2010)我提供了一个简单的“data.txt”文件,其中包含一个表示签名文件名数量的整数;接着是那么多签名,然后是另一个代表神秘文本数量的整数;紧随其后的是许多神秘的文字。我的问题是,如何从另一个文本文档中给定的路径读取文件?'data.txt' 文件如下:

13
signatures/agatha.christi.stats
signatures/alexandre.dumas.stats
signatures/brothers.grim.stats
signatures/charles.dickens.stats
signatures/douglas.adams.stats
signatures/emily.bronte.stats
signatures/fyodor.dostoevsky.stats
signatures/james.joyce.stats
signatures/jane.austen.stats
signatures/lewis.caroll.stats
signatures/mark.twain.stats
signatures/sir.arthur.conan.doyle.stats
signatures/william.shakespeare.stats
5
documents/mystery1.txt
documents/mystery2.txt
documents/mystery3.txt
documents/mystery4.txt
documents/mystery5.txt

其中一个签名文件如下(不要问为什么我的教授决定使用.stats,因为我不知道):

agatha christie

4.40212537354

0.103719383127

0.0534892315963
1
0.0836888743

1.90662947161

我无法更改文件,也无法更改保存它们的区域。我可以轻松读取“data.txt”文件,但似乎根本找不到签名文件。任何帮助,将不胜感激。读入签名后,我计划将它们保存为数组中的结构,以便稍后在项目中引用它们,将它们与神秘文本的签名进行比较。这个程序正在使用命名空间 std,如果这对任何人都很重要......

4

3 回答 3

0

例如阅读双打。

File *file;
file = std::fopen(filename.c_str(), "r+b");

std::fread(&/*variableName*/, sizeof(double), 1, file);

这是你要找的吗?

于 2013-10-31T02:27:43.007 回答
0

我假设您的目录结构如下:

the_program
data.txt
signatures/...
documents/...

那么读取文件应该很简单:

std::ifstream in("data.txt");
std::vector<std::string> files;
int num_files;
in >> num_files;
for (unsigned i = 0; i < num_files; ++i) {
    std::string file;
    in >> file;
    files.push_back(file);
}

// read mystery filenames

std::vector<std::string>::iterator it;
for (it = files.begin(); it != files.end(); ++it) {
    std::ifstream sig(it->c_str());

    // sig is your signature file. Read it here
}
于 2013-10-31T02:37:14.163 回答
0

@ptic12 你的回答很有帮助,我设法编辑/操作它以获得我需要的东西。我为签名创建了一个类以使其更简单。这段代码写得相当简单,它比它需要的要长,但它可以工作,在项目的后期我计划“瘦身”一点

当然,这其中缺少一些东西,但是如果我将它们包括在内,那将是一个很长的帖子

vector<Signature> MakeSignatures(string DataFile)
{
    string SigFile="", MystFile="";
    int NumSig=0, NumMystery=0;
    ifstream infile(DataFile);// opens data.txt
    infile >> NumSig;
    vector<Signature> SigStorage;//creates a vector in which to store signature objects
    for(int i=0; i <NumSig; i++)
    {
        infile >> SigFile;
        Signature Sig(SigFile);
        SigStorage.push_back(SigFile);
    }
    infile >> NumMystery;
    for(int i=0; i < NumMystery; i++)
    {
        infile >> MystFile;
        //not quite done here yet
            //large part of project will be called here
    }

    return SigStorage;
}

以及 Signature 类的 .cpp 中的构造函数

Signature::Signature(string SigFile)
{
    ifstream in(SigFile);
    while(!in.eof())
    {
        getline(in, AuthName); //gets author name
        in >> AverageWord; //get next 5 floats 
        in >> TypeToken;
        in >> HapaxLego;
        in >> AverageNumber;
        in >> SentenceCom;
    }

}

希望这将帮助任何需要与我相同的帮助的人。(data.txt 包含拼写错误的路径并没有真正帮助,需要一段时间才能弄清楚)

于 2013-11-03T20:34:32.587 回答