用C++读取文件中的字符

用C++读取文件中的字符,c++,C++,我已经创建了一个文件hangman\u word\u collection.txt,并将该文件的所有内容存储到字符串行中 现在我想在程序中使用行字符串,但行[0]中没有任何值,或者我不知道其中是否有内容 我是新手,请帮忙 代码如下: #include <iostream> #include <fstream> using namespace std; int main() { string line; ifstream myfile ("hangman_word_c

我已经创建了一个文件hangman\u word\u collection.txt,并将该文件的所有内容存储到字符串行中

现在我想在程序中使用行字符串,但行[0]中没有任何值,或者我不知道其中是否有内容

我是新手,请帮忙

代码如下:

#include <iostream>
#include <fstream>

using namespace std;

int main() {
string line;

ifstream myfile ("hangman_word_collection.txt");
if (myfile.is_open()) {
    while (myfile.good()) {
        getline (myfile,line);
        cout << line << endl;
    }
}
for(int i=0; i <= 79; i++) {
    cout << "\n" << i;
    cout << ":" << line[i];
}
return 0;
}
以及输出:

ActingRaringBackupCampusAcoite易于制造,并以原始方式装载。 0: 1:c 2:t 3:我 4:n 5:g 6:r 7:a 8:r 9:我 10:n 11:g 12:b 13:a 14:c 15:k 按以关闭此窗口。。。 当getline写入目标行失败时,您假定它不会修改该字符串中的内容,但会将该字符串置空,这在内部将用空字符替换字符0

其余的是未定义的行为,因为您正在读取逻辑字符串末尾的字符

若要解决此问题,请将代码更改为

string line;

ifstream myfile ("hangman_word_collection.txt");
if (myfile.is_open())
{
    while (myfile.good())
    {
       std::string temp;
       if( getline( myfile, temp ) )
       {
           temp.swap( line );
           cout <<line<<endl;
       }
    }
}
请注意,用像79这样的幻数硬编码是不好的做法。如果改为使用line.size,则会看到字符串的实际大小,并且不会出现未定义的行为。如果担心性能,您可以将其存储在循环外的变量中,尽管这可能没有什么区别。

当getline在写入目标行时失败时,您假设它不会修改该字符串中的内容,但会将该字符串置空,它在内部将字符0替换为空字符

其余的是未定义的行为,因为您正在读取逻辑字符串末尾的字符

若要解决此问题,请将代码更改为

string line;

ifstream myfile ("hangman_word_collection.txt");
if (myfile.is_open())
{
    while (myfile.good())
    {
       std::string temp;
       if( getline( myfile, temp ) )
       {
           temp.swap( line );
           cout <<line<<endl;
       }
    }
}

请注意,用像79这样的幻数硬编码是不好的做法。如果改为使用line.size,则会看到字符串的实际大小,并且不会出现未定义的行为。如果您担心性能问题,可以将其存储在循环外的变量中,但很可能没有什么区别。

如果您将最终cout行更改为coutit,则正在打印一些数字Hello World!ActingRaringBackupCampusAcoite易于制造,并以原始方式装载。0:0 1:99 2:116 3:105 4:110 5:103 6:114 7:97 8:114 9:105 10:110 11:103 12:98 13:97 14:99 15:107按此按钮可关闭此窗口…while循环首先有什么用途吗。您只需要文件中的最后一行??查看初始输出行之后有多少空间。至少有三个返回,这告诉我你的数据行后有空行,因此清除行缓冲区并硬终止它,正如CashCow下面所描述的。不是在这件事上,但我将用于一些多行文件,如果你将最后的cout行更改为cout,它将打印一些数字Hello World!ActingRaringBackupCampusAcoite易于制造,并以原始方式装载。0:0 1:99 2:116 3:105 4:110 5:103 6:114 7:97 8:114 9:105 10:110 11:103 12:98 13:97 14:99 15:107按此按钮可关闭此窗口…while循环首先有什么用途吗。您只需要文件中的最后一行??查看初始输出行之后有多少空间。至少有三次返回,这告诉我你的数据行后面有空行,因此清除你的行缓冲区并硬终止它,正如CashCow在下面描述的那样。不是在这件事上,但我将使用一些多行文件+1,这完全是个问题。不知道while循环是为了什么;也许是未来对多行单词列表的渴望。接得好。我也不知道它为什么在那里。我只是应用了可以工作的最小修复,即读取文件中的最后一行有效代码;cout@CashCow我的文件中有两条文本。但只有第二个是read+1,这完全是问题所在。不知道while循环是为了什么;也许是未来对多行单词列表的渴望。接得好。我也不知道它为什么在那里。我只是应用了可以工作的最小修复,即读取文件中的最后一行有效代码;cout@CashCow我的文件中有两条文本。但只有第二个被读取