C++ C++;忽略第一个字符

C++ C++;忽略第一个字符,c++,C++,我试图读取一个文本文件(text.txt),其中包含 1. One 2. Two 3. Three 4. Four 5. Five 6. Six 但是它忽略了第一个字符,并给出了以下输出 1. One Three Five Two Six Four 它忽略了数字。我的程序将输入文件读取到一个数组中,并随机吐出数组中的项。它可以工作,但不能打印出数字。我该如何解决这个问题 下面是我的代码 #include <iostream> #include <string>

我试图读取一个文本文件(text.txt),其中包含

1. One
2. Two
3. Three
4. Four
5. Five
6. Six
但是它忽略了第一个字符,并给出了以下输出

1. One
 Three
 Five
 Two
 Six
 Four
它忽略了数字。我的程序将输入文件读取到一个数组中,并随机吐出数组中的项。它可以工作,但不能打印出数字。我该如何解决这个问题

下面是我的代码

#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>

int main()
{
    const int arraySize = 6;
    //random seeding
    srand(time(0));
    std::string myArray[arraySize];
    std::ifstream inFile("text.txt");

    if (inFile.is_open())
    {
        int i = 0;
        while (i < arraySize && std::getline(inFile, myArray[i++]))
        {
            inFile >> myArray[i];
        }
    }
    for (int i = 0; i < arraySize; i++)
    {
        int index = rand() % arraySize;
        //swap myArray[i] with myArray[index]
        std::string temp = myArray[i];
        myArray[i] = myArray[index];
        myArray[index] = temp;
    }

    for (int i = 0; i < arraySize; i++)
    {
        std::cout << myArray[i] << std::endl;
    }
    return 0;
}
#包括
#包括
#包括
#包括
int main()
{
常数int arraySize=6;
//随机播种
srand(时间(0));
std::string myArray[arraySize];
std::ifstream infle(“text.txt”);
if(infle.is_open())
{
int i=0;
而(i>myArray[i];
}
}
for(int i=0;ii=0
)中,您使用
getline
获得第一行,并将其分配给
myArray[0]
,并立即递增变量
i
。现在
i
等于
1
。然后在
循环期间输入
,并使用
运算符读取第二行,直到到达第一个空格,并将其分配给
myArray[1]

循环的下一次迭代中(
i
仍然是
1
),读取第二行的剩余字符并将其分配给
myArray[1]
;这就是该数字被忽略的原因。然后将
i
增加到
2
,该模式将一直出现,直到循环结束


你不需要
infle>>myArray[i];
行;使用
getline
可以做你想做的事。

你在
循环中做的比你想象的要多

std::getline(infle,myArray[i++])
实际上完成了您需要的一切。
getline()
从输入流中读取完整的文本行,直到换行符(换行符从输出中排除)

>
操作符从流中读取数据,最多可读取任何空格字符,包括新行。因此,此行:

infle>>myArray[i];

从文件中读取一个单词(在本例中为行首的数字),其余单词保留在后面,包括空格。循环继续时,
getline()
读取该行的其余部分。因为
i
直到之后才会递增,所以该行的其余部分将复制到该数字所在的同一数组元素中,并将其作为一个全新的字符串覆盖

第一行“1.One”是正确的,因为当
getline()
首次读取文件时,输入流处于最开始的位置。循环的主体尚未执行。然后,
i
递增,程序读取第二行的第一个“字”(
2.
),当循环再次运行时,它随后会被
Two
覆盖

因此,解决方案是将
while
循环保留为空体,如下所示:

while (i < arraySize && std::getline(inFile, myArray[i++]))
{
    ;
}

在循环体中执行
i++
,而不是在
while
的条件下执行。您可以通过运行调试器并观察程序中所有变量的值(当它们发生变化时)来解决此问题,同时使用调试器一次运行一行程序。这就是调试器的用途。了解如何使用调试器是一个必要的步骤对每个C++开发者都要杀掉。我相信,在代码中,你可以用你的调试器轻松地找出这个简单的bug。从长远来看,学习如何调试自己的代码总是更好的,而不是每次查看代码时都不能把问题发布到网站上。更糟糕的是。@MarkRansom我看到的只是摆脱
infle>>myArray[I];
。调用
getline
就可以了。
while (i < arraySize)
{
    std::getline(inFile, myArray[i++]);
}