C ++从用户给出的文件中读取

时间:2017-03-02 18:09:54

标签: c++ ifstream

我正在创建一个简单的目录程序,允许用户输入文件名并按名称,地址或电话号码搜索该文件。我无法正确阅读该文件。

如果有人可以就如何解决我的getFirstName功能提供建议。该函数应该读取文件的第一个单词。

示例文件:

Bob Smith 123456789
123 Main Street
Susan Smith 1224445555
543 Market Street

到目前为止,这是我的代码的一部分。

 string file;
 string first;
 int main() {
     ifstream inFile;
     cout<<"Enter file name: ";
     cin>> file;
     inFile.open(file);
     if(inData.fail()) {
         cout<<"INVAILD";
     }
     getFirstName(first);
}

void getFirstName(string f, inFile file) {

    file.open(f);
    while(file.good(f)) {
        file>>f;
    }
    if (file.bad()) {
        cout<<"Name not found";
    }
}

4 个答案:

答案 0 :(得分:1)

我不会给你写这个节目,但是让我指出你的方向。

首先:请更好地格式化代码。也许它只是因为stackoverflow,但应该有一致和有意义的代码格式,否则你和其他人不能很好地阅读它,并找不到问题。 (PLZ google clang-format for a tool,也许是ide也会这样做。)

将您的程序拆分为不同的逻辑部分。我的方法是:

  1. 打开文件,如果不可能发出警告,结束程序
  2. 将文件内容读入字符串IN:filename,OUT:内容字符串
  3. 将字符串拆分为行,IN:字符串,OUT:std :: vector
  4. 对于每一行,将行拆分为多个部分(3个元素?)IN:linestring,OUT:name,street,...
  5. 你可以在正确的数据结构中,plz看到STL的好的
  6. 访问您的数据结构以获取所需信息。
  7. 建议您的数据。

    • istream for file,你有
    • std :: string for file content
    • std :: vector for line wise filecontent
    • std :: unordered_map将名称映射到信息。

    这应该给你一个谷歌搜索开始。每个子问题都可以独立解决(并经过测试),更容易在SO上找到:)

    祝你好运。

答案 1 :(得分:0)

我同意这些意见。然而要回答你的问题&#34;该函数应该读取文件的第一个单词。&#34;下面是如何从文件中读取第一个单词的一般概念:

    ...
    ifstream inFile; // define your input stream
    string firstwrd; // first word

    inFile.open("yourfile"); // open your file
    inFile>> firstwrd; // this will read the first word
    inFile.close(); // close the file
    ...

请考虑阅读乔纳斯的评论。

编辑:请注意我的答案绝不是从文件中读取最佳做法的权威教程。它适用于您的具体案例。

HTH!

答案 2 :(得分:0)

在开始编程之前,您必须确定要读取的文件的确切格式。该格式为您提供了打算如何从文件中读取操作的操作顺序。

在您的示例中,您给出:

Bob Smith 123456789
123 Main Street
Susan Smith 1224445555
543 Market Street

分为以下格式:

[First Name] [Last Name] [User ID (I assume)]\n
[Address]

现在我们已经建立了,我们要做的第一件事就是打开文件流。

ifstream file("path\\to\\file");

从文件流中检索信息时,有两种标准方法:>>运算符和getline()

>>运算符将给定fstream中的下一个文本块返回到任何空格字符,例如空格,换行符或返回字符。其语法为file >> var,其中file是您要读取的fstreamvar是您要写入的变量。

getline()函数将返回整行,包括空格,但会在返回和换行符处停止。函数的实际语法是std::getline(read, write);,其中read是您要实际读取的文件流或字符串,write是您要将实际行复制到的变量。

例如:

ifstream file("file.txt");
string firstname, lastname, id, address;

file >> firstname; //get the first word of the file.
file >> lastname; //get the second word of the file.
file >> id; //get the third word of the file.

getline(file, address); //Get the next whole line of the file, regardless of how many words.

一个有趣的怪癖是,您不必担心手动告诉C ++您想要查找数据的文件中的哪个位置。在读取文件时,指针会自动保留在文件流的内部,从下一个开始读取的位置。当你得到一个单词时,指针会自动从下一个单词的开头开始,所以你只需要线性地拉数据,直到你到达文件的末尾。

答案 3 :(得分:0)

void getFirstName(string f, inFile file);应为void getFirstName(string f, ifstream inFile);

请记住,在变量类型和名称之间添加&符号(&amp;)以避免创建文件的副本(消耗更多ram),如果你想要的话,不要使用&符号是合理的对不应该留下的变量进行更改。

字符串f在哪里定义?您可以在不传递f的情况下调用该函数,但它已在函数中使用。这是严重的问题。

ifstream.good()函数如果我没记错,就不能参数。

如果你试图找到f(你没有告诉我们它是什么,所以我可以更精确)那么你应该首先明白f应该是一个文件(因为你使用file.open(f);),将值传递给字符串,然后执行inFile >> name_of_your_string;执行if (name_of_your_string == f) { /* the last word read corresponds to f */}

类型是ifstream,变量的名称是inFile。 此外,因为getFirstName是在main之后定义的,所以你必须将它放在main void getFirstName(string f, ifstream inFile);之前,这称为原型,它告诉编译器该函数在main之后。

显然,不要删除剩下的功能。如果这对你来说是一个问题,那就移动它。此外,如果有人在输入中放入空格,最后一个空格将丢失,请删除cin >> file;并使用getline (cin, file);

请记住更新答案,详细了解f是什么以及您希望它做什么。

编辑:请在停止阅读文件后使用inFile.close();以避免细微错误。