【问题标题】:C++ std::getline result string won't let me concatenate another string to itC++ std::getline 结果字符串不允许我将另一个字符串连接到它
【发布时间】:2016-07-14 08:43:37
【问题描述】:

我正在尝试从只包含名称列表的 .txt 文件中读取数据。我想对每个名称执行以下操作:

1) read a name and store it in a string variable.
2) Add quotes to the name ("name")
3) make a map entry using each name (map["name"]= x)

我正在使用 std::getline 函数来读取每一行,并且我试图通过使用 ( string name="\""+line+"\"" ) 简单地添加引号。 问题是每次我在行字符串的末尾添加一些东西,什么都没有添加!

这是我的代码:

#include <iostream>
#include <string>
#include <map>
#include <fstream>
#include <stdlib.h>

using namespace std;

int main(){
    ifstream reader("input.txt");
    string line;
    string name;
    map<string,int> arr;
    int np=5;
    for(int i=0;i<np;i++){
        getline(reader,line);
        name="\"" +line +"\"";
        cout<< name << endl;
    }
    return 0;
}

这是我的输入 txt 文件:

dave
laura
owen
vick
amr

这是我目前得到的输出:

"dave
"laura
"owen
"vick
"amr"

非常感谢!

【问题讨论】:

  • 在输出中添加另一个endl 进行测试。我怀疑您的文件的行尾约定与您正在读取的系统不同。
  • 您的代码在我看来运行良好。 cout &lt;&lt; line &lt;&lt; endl; cout&lt;&lt; name &lt;&lt; endl; 怎么样?
  • 如果我在 Linux 上运行,但在 input.txt 中使用 DOS 行结束约定,那么它看起来很相似。额外的 CR 将最后一个双引号放在终端的最左侧。
  • 不要使用std::endl,除非你需要它做的额外的东西。 '\n' 结束一行。
  • 确定要添加引号吗?你不被字面符号弄糊涂了吗?

标签: c++ string fstream string-concatenation getline


【解决方案1】:

我想您的输入行以 \r\n 结尾,而您的 getline 一直读取到 '\n'。如果这是真的,那么解决方案是在行尾手动删除 \r char:

getline(reader,line);
line.pop_back();

[编辑]

或者代替pop_back():

auto cr_pos = line.rfind('\r');
if ( cr_pos != std::string::npos )
  line = line.substr(0, cr_pos);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多