【问题标题】:After while loop exits, contents of the string are being deleted?while循环退出后,字符串的内容被删除了吗?
【发布时间】:2017-02-01 22:38:36
【问题描述】:

大家好,这是我的第一篇文章,所以如果我犯了任何错误,例如信息不足等,请告诉我,这样我就不会再犯了。

所以我的问题是我需要获取文件的内容,然后将它们输入到我正在工作的字符串中。但是,在 while 循环结束后,如果我尝试在 while 循环之外使用该字符串并操作字符串的内容。字符串为空白,似乎没有内容。我通过使用 std::cout 行确定了这一点。我认为这是一个范围问题,但我不确定如何解决它。以下是与问题有关的代码,任何提示或帮助将不胜感激!

 std::string str;
 std::ifstream file;

 while(!file.eof()){
 getline(file, str);
 std::cout << str << "";

 }

 file.close();

 std::cout << str << "";

 std::map<std::string, int> map;

 for(int i = 0; i < str.length(); ++i){

   std::string sub = str.substr(i, k);

   std::cout << sub << std::endl;

   map.insert(make_pair(sub, 1));

   }

  std::cout << "" << std::endl;

另外,我试图将字符串切成大小 k,这是在代码的不同部分定义的变量,所以我在 C++ 中使用了 substr 方法,我相信这是有效的,因为当我把它放入while 循环我可以打印出文件的内容,但格式已关闭,我认为这是因为 while 循环运行方式的性质,但我不确定,如果我错了或有任何误解,请纠正我.

【问题讨论】:

  • 一个你不应该再犯的明显错误是显示的代码不能满足minimal reproducible example的所有要求。
  • 好的,我刚刚阅读了那个文档,我明白了,谢谢你的指点!

标签: c++ string while-loop scope cout


【解决方案1】:

将文本文件存储到std::vector 中,然后选择要处理的句子不是更容易吗? 示例:

int main()
{
    std::string str;
    std::ifstream file{ "file.txt" };
    std::vector<std::string> vec;

    // Store text file in vector
    while (std::getline(file, str)) {
        vec.emplace_back(str);
    }

    // Print out line 2:
    std::cout << vec.at(1) << '\n';

    // Reverse line 2 and print:
    std::string line2 { vec.at(1) };
    std::reverse(begin(line2), end(line2));
    std::cout << line2 << '\n';
}

【讨论】:

  • 老实说,我从来没有想过这一点,截至目前,我正在处理的程序几乎完成了,但我会在进行更多练习后尝试向量实现,是否还有其他原因表明向量更好/ 在这种情况下比字符串容易吗?
  • @firetiger443 如果它存储在向量中,它将让您选择要操作的文本文件的哪一行。前任。第 4 行:vec.at(5) 等。
【解决方案2】:

getline(file, str); 一次只能存储一行。我的猜测是你文件的最后一行是空白的,所以存储到str 的最后一个值是空白的。

您可以连接而不是覆盖:

std::string temp;
std::string str;
std::ifstream file;

while(!file.eof()){
    getline(file, temp);
    std::cout << str << "";
    str = str + temp;
}

或者,添加 #include &lt;fstream&gt; 并使用:

std::ifstream inputStream("myfile.txt");
std::string str((std::istreambuf_iterator<char>(inputStream), 
                (std::istreambuf_iterator<char>()));

【讨论】:

  • 这很完美,这很有道理,我从来没想到过,谢谢你的回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 2013-03-01
  • 2019-04-20
  • 2019-08-28
相关资源
最近更新 更多