2016-09-24 60 views
1

嘿大家这是我的第一篇文章,所以如果我犯了任何错误,如没有足够的信息等,请让我知道,所以我不再让他们。while循环退出后,字符串的内容被删除?

所以我的问题是我需要采取一个文件的内容,然后将它们输入到一个字符串,我有工作。然而,在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循环运行的性质,但我不确定,如果我错了,请纠正我或有任何误解。

+0

一个明显的错误,你不应该再犯的是,所示的代码不能满足所有的[MCVE]的要求。 –

+0

好吧,我只是通读该文档,我明白,谢谢你的指针! – firetiger443

回答

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'; 
} 
+0

我真的从来没有想过这一点,因为我现在正在开发的程序几乎已经完成了,但是我会在尝试一个向量实现之后进行更多的练习,还有其他原因导致向量比字符串更好/更容易案件? – firetiger443

+0

@ firetiger443如果它存储在向量中,它会让你选择你想要处理的文本文件的哪一行。防爆。第4行:'vec.at(5)'等 –

1

您一次只能存储一行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 <fstream>及用途:

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

这工作完美,这是有道理的,我永远不会猜到,谢谢你的答案! – firetiger443