C++ C++;忽略第一个字符
我试图读取一个文本文件(text.txt),其中包含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>
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++]);
}