将多个字符串打印到文件

Posted

技术标签:

【中文标题】将多个字符串打印到文件【英文标题】:Printing Multiple Strings to a File 【发布时间】:2015-04-23 00:22:38 【问题描述】:

我正在处理电话簿,到目前为止,我已经成功地让用户输入他们的信息,将其保存为字符串,将字符串保存到文件中,并使用关键字搜索该字符串。但是,它只对输入的第一个联系人起作用。当输入新联系人时,它会覆盖文件中保存的先前字符串。我怎样才能让它打印到下一行,并开发一个可以搜索的联系人列表。任何帮助深表感谢。这是我的代码:

#include <iostream>
#include <string>
#include <ostream>
#include <fstream>

using namespace std;

struct person

    string Name;
    string Address;
    string PhoneNumber;
    string Email;
;

int main()

ResetUserSelection:
    vector<person>ContactList;

    int userselection = 0;

    cout << "Press 1 to Add Contact" << endl;
    cout << "Press 2 to Search for Contact"<<endl;
    cout << "What do you want to do? ";
    cin >> userselection;

    if(userselection == 1)
    
        person newPerson;

        cout << endl;
        cin.ignore();
        cout << "What is your Name? " ;
        getline(cin,newPerson.Name);

        cout << "What is your Address? " ;
        getline(cin,newPerson.Address);

        cout << "What is your Phone Number? " ;
        getline(cin,newPerson.PhoneNumber);

        cout << "What is your Email? ";
        getline(cin,newPerson.Email);

        cout << endl;

        string fullContact = "Name: " + newPerson.Name + ", Address: " +     newPerson.Address + ", Phone Number: " + newPerson.PhoneNumber + ", Email: " +     newPerson.Email + "\n";

        cout <<fullContact;

        cout << endl;

        ofstream myfile;
        myfile.open ("contactlist.txt");
        myfile << fullContact;
        myfile.close();
        goto ResetUserSelection;

        goto ResetUserSelection;
    
    else
    
        string search;

        ifstream Myfile;
        Myfile.open ("contactlist.txt");
        cout << "Who do you want to search for?" << endl;
        cin >> search;
        cout << endl;

        ifstream myfile;
        myfile.open ("contactlist.txt");
        string contact;
        while(getline(myfile, contact))
        
            if(contact.find(search) != string::npos)
            
                cout << search << "'s contact info" << endl << contact << endl << endl;
            
        
        myfile.close();

        goto ResetUserSelection;
    

【问题讨论】:

这就是人们讨厌goto的原因,因为有些人给了它最糟糕的用途,你不能写个循环吗? 【参考方案1】:

当您打开文件进行写入时,默认情况下将filepointer 设置为文件的开头。您应该在打开文件时添加附加选项。

查看ofstream::open的API怎么做:

myfile.open ("contactlist.txt", ofstream::out | ofstream::app);

【讨论】:

【参考方案2】:

这一行:myfile.open ("contactlist.txt"); 缺少第二个参数,模式,应该是app

app 表示打开追加。 IE。添加到文件的末尾。

【讨论】:

问题:那为什么代码会编译,是否存在忽略参数的重载?参数是否有默认值? 默认值:void open (const char* filename, ios_base::openmode mode = ios_base::out); @user4581301 使用此字符` 使代码部分使用等宽字体,这使它们更易于阅读,并且还通过为它们提供灰色背景来突出显示它们。 谢谢。每天学习新东西!【参考方案3】:

首先,包含矢量,因为您正在使用它。 现在,由于没有为 std::fstream::open 提供正确的参数,您面临这个问题,因此它会覆盖以前的内容。

替换

    myfile.open ("contactlist.txt"); 

    myfile.open ("contactlist.txt",std::fstream::out|std::fstream::app);

它应该可以工作。更多详情,http://www.cplusplus.com/reference/fstream/fstream/open/

【讨论】:

以上是关于将多个字符串打印到文件的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将包含字符串、变量和整数的多个打印命令包装到以后可以写入文件的变量中

将字符串打印到文件,为啥需要额外的位?

如何在Java中向后打印多个字符串

打印输出 echo、tee、cat

记录器配置以记录到文件并打印到标准输出

linux基础指令以及权限管理