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

C++ C++;从用户给定的文件中读取,c++,ifstream,C++,Ifstream,我正在创建一个简单的目录程序,允许用户输入文件名并按名称、地址或电话号码搜索该文件。我在正确读取文件时遇到问题 如果有人能给我建议如何修复我的getFirstName函数。函数应该读取文件的第一个字 示例文件: Bob Smith 123456789 123 Main Street Susan Smith 1224445555 543 Market Street 这是我到目前为止的部分代码 string file; string first; int main() { ifst

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

如果有人能给我建议如何修复我的
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";
    }
}
字符串文件;
先串;
int main(){
河流充填;
cout文件;
inFile.open(文件);
if(inData.fail()){
coutf;
}
if(file.bad()){

我不会给你写程序,但让我给你指出一个方向

首先:请更好地格式化你的代码。也许这只是因为stackoverflow,但是你的代码应该有一致的和有意义的格式化,否则你和其他人不能很好地阅读它,并且很难找到问题。(请使用google clang format作为工具,也许ide也可以)

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

  • 打开文件,如果不可能,发出警告,结束程序
  • 将文件内容读入:文件名,读出:内容字符串
  • 将字符串拆分为行,IN:string,OUT:std::vector
  • 对于每一行,将该行拆分为多个部分(3个元素?)IN:linestring,OUT:name,street
  • 您可以在适当的数据结构中看到好的STL
  • 访问您的数据结构以获取所需信息
  • 关于你的数据的建议

    • 我想要文件,你有吗
    • 文件内容的字符串
    • 行文件内容的std::vector
    • 无序映射将名称映射到信息
    这应该给你一个谷歌搜索的开始。每个子问题都可以独立解决(并进行测试),而且更容易在上面找到:)


    祝你好运。

    我同意这些评论。但要回答你的问题“函数应该读取文件的第一个单词”。下面是如何从文件中读取第一个单词的一般想法:

        ...
        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!

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

    在您的示例中,您给出:

    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
    是要读取的
    fstream
    ,而
    var
    是要读取的变量写信给

    getline()
    函数将返回整行,包括空格,但将在返回字符和换行符处停止。函数的实际语法为
    std::getline(读、写)
    其中,
    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.
    
    <> P>一个有趣的怪癖是,你不必担心手动告诉C++文件中你想查找数据的地方。当文件被读取时,指针会自动保存在从下一个开始读的文件流中。当你得到一个单词时,指针会在下一个单词的开头自动开始,所以你只需在下一个单词的开头就可以开始。继续线性拖动数据,直到到达文件末尾。

    void getFirstName(字符串f,infle文件);
    应为
    void getFirstName(字符串f,ifstream infle);

    请记住,在变量类型和名称之间加上一个符号(&),以避免创建文件副本(消耗更多ram),只有在您希望对变量进行不应保留的更改时,才可以使用不加符号

    字符串f是在哪里定义的?你调用函数时没有传递f,但是它被用在函数中。这是一个严重的问题

    如果我没记错的话,ifstream.good()函数不能接受参数

    如果您试图找到f(您没有告诉我们它是什么,所以我不能更准确地说),那么您应该首先了解f应该是一个文件(因为您使用了
    file.open(f);
    ),将值传递给字符串,然后在执行
    infle>>命名您的字符串之后;
    do
    If(name\u of\u your\u string==f){/*读取的最后一个字对应于f*/}

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

    显然,不要删除函数的其余部分。如果这是一个问题,请将main移到它下面。此外,如果有人在输入中放入空格,则在最后一个空格丢失之前,请删除
    cin>>文件;
    并使用
    getline(cin,file);

    请记住更新答案,提供更多关于f是什么以及您希望它做什么的详细信息


    编辑:请记住在停止读取文件后使用
    infle.close();
    ,以避免细微错误。

    您的代码中存在大量语法问题。逐个检查并修复它们。请注意
    infle
    是一个变量,而不是一种类型。您无法发送
    inFi