【问题标题】:Issue reading line from file with getline()使用 getline() 从文件中读取行
【发布时间】:2015-01-21 18:14:25
【问题描述】:

我设置了 readFile() 方法,以便我的“myList”向量保持更新,但是当我运行程序时,尽管我的 addItem() 方法正确写入文件,但我的向量为空。

我已尝试四处寻找有关 ifstream 和 getline 的问题,但大多数解决方案都是预先知道每行读取的项目数的变通方法。

如果有人能告诉我我做错了什么,我将不胜感激。

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>

using namespace std;

void readFile(vector<string> myList);
void writeToFile(vector<string> myList);
void mainMenu();
void displayList(vector<string> myList);
void addItem(vector<string> myList);
void removeItem(vector<string> myList);

string fileName = "C:\\Users\\Owner\\Documents.todo_list.txt";

int main()
{
    vector<string> myList;

    int choice;

    do
    {
        readFile(myList);

        mainMenu();

        cin >> choice;

        cout << endl;

        switch(choice)
        {
            case 1:
            {
                displayList(myList);
                break;
            }
            case 2:
            {
                addItem(myList);
                break;
            }
            case 3:
            {
                removeItem(myList);
                break;
            }
            default:
            {

            }
        }

        cout << endl;
    } while (choice != 0);

    return 0;
}

void readFile(vector<string> myList)
{
    ifstream read(fileName.c_str(), ios::in);

    if(!read)
    {
        cout << "Could not open file." << endl;
        exit(1);
    }

    if (myList.size() > 0)
    {
        myList.clear();
    }
    else
    {
        string item;

        getline(read,item);

        myList.push_back(item);
    }

    read.close();
}

void writeToFile(vector<string> myList)
{
    ofstream rewrite(fileName.c_str(), ios::out);

    for (int i = 0; i < myList.size(); ++i)
    {
        rewrite << myList[i] << endl;
    }

    rewrite.close();
}

void mainMenu()
{
    cout << " ========== Main Menu ==========" << endl;
    cout << " 1. Display To-do List" << endl;
    cout << " 2. Add item to the To-do List" << endl;
    cout << " 3. Remove item from the To-do List" << endl;
    cout << "\n 0. Exit program" << endl;
    cout << ": ";
}

void displayList(vector<string> myList)
{
    cout << " ========== To-do List =========" << endl;

    if (myList.empty())
    {
        cout << "      ----- empty list -----" << endl;
    }
    else
    {
        for (int i = 0; i < myList.size(); ++i)
        {
            cout << " " << (i + 1) << ". " << myList[i] << endl;
        }
    }
}

void addItem(vector<string> myList)
{
    ofstream write(fileName.c_str(), ios::app);

    string item;

    cout << "Please enter an item to add to the list: ";

    cin.ignore();
    getline(cin, item);

    write << item << endl;

    write.close();
}

void removeItem(vector<string> myList)
{
    int item;

    displayList(myList);

    cout << "\nPlease select an item to delete: ";
    cin >> item;

    cout << endl;
    cout << "...removing \"" << myList[item - 1] << "\"" << endl;

    myList.erase(myList.begin() + (item - 1));

    writeToFile(myList);
}

【问题讨论】:

  • 您是否打算在 readFile 函数中将 myList 向量作为参考?
  • 谢谢 sajas,你是 100% 正确的。我还删除了 readFile() 中的“else”语句,并将其更改为 while (!read.eof()) { string item;获取线(读取,项目); myList.push_back(item); }

标签: c++ fstream ifstream getline


【解决方案1】:

readFile的参数好像是一个参考:

void readFile(vector<string>& myList)

顺便说一句,当前的 readFile 只读取一行。

【讨论】:

  • 是的,我注意到当我回去添加参考时。出于某种原因,我对这种方法感到困惑,并在不需要时将其设为“if-else”。
猜你喜欢
  • 1970-01-01
  • 2023-03-17
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
相关资源
最近更新 更多