- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试读取文件的一行,打印出该行的部分内容,然后对文件的下一行重复该过程。
但它无法正常工作,当我将输出推送到 cmd 行时,很明显 while 循环永远不会退出。
我也尝试过使用 getline() 代替相同的过程,但我遇到了同样的问题,它只是无限地读取和重新读取文件。
这是我的代码:
fstream scores;
scores.open("scores.txt");
string playerName;
string playerScore;
int i = 0;
while (scores >> playerName >> playerScore && i < 8) {
int line = i * 40;
int rank = i + 1;
// testing
cout << rank << " " << playerName << " " << playerScore << "\n";
char plRank[1];
sprintf(plRank, "%i", (rank));
char plName[8];
sprintf(plName, "%s", "Name");
char plScore[8];
sprintf(plScore, "%s", "score");
DrawScreenString(GAX1 + 20, GAY1 + 120 + line, plRank, 0x505050, pBody);
DrawScreenString(GAX1 + 320, GAY1 + 120 + line, plName, 0x505050, pBody);
DrawScreenString(GAX1 + 570, GAY1 + 120 + line, plScore, 0x505050, pBody);
i++;
}
scores.close();
这是 cmd 行输出的摘录。
1 Edward 100
2 Jodi 80
3 Tom 50
4 Emma 40
1 Edward 100
2 Jodi 80
3 Tom 50
4 Emma 40
1 Edward 100
2 Jodi 80
3 Tom 50
4 Emma 40
1 Edward 100
2 Jodi 80
3 Tom 50
4 Emma 40
1 Edward 100
2 Jodi 80
3 Tom 50
4 Emma 40
1 Edward 100
2 Jodi 80
3 Tom 50
4 Emma 40
1 Edward 100
2 Jodi 80
3 Tom 50
4 Emma 40
...
这是 scores.txt 文件包含的内容
Edward 100
Jodi 80
Tom 50
Emma 40
如有任何关于它为何无限循环或修复的建议,我们将不胜感激!
最佳答案
I also tried the same process just using getline() instead, but I have the same problem, it just reads and re-reads the file infinitely.
您应该向我们展示了无效的 std::getline
代码。使用 std::getline
当然是这里的首选解决方案。您是否碰巧使用了成员函数而不是与 std::string
一起使用的独立函数? sprintf
和数组不是完成此任务的错误工具。
这是你应该做的:
std::getline
函数读取整行。std::getline
返回的 std::ifstream
本身(由于运算符重载,它会起作用)。std::string
的 c_str
成员函数将字符串安全地传递给 DrawScreenString
。例子:
std::string line;
while (std::getline(scores, line) && (i < 8))
{
std::vector<std::string> const tokens = tokenize(line);
// ...
DrawScreenString(GAX1 + 20, GAY1 + 120 + line, tokens[0].c_str(), 0x505050, pBody);
// and so on
}
剩下的有趣问题是如何编写tokenize
函数:
std::vector<std::string> tokenize(std::string const &line)
{
// ?
}
也许 Boost Tokenizer可以帮你。但您也可以只使用 std::string
的成员函数,例如 find
和 substr
。
只是给你一个想法:
std::vector<std::string> tokenize(std::string const &line)
{
std::vector<std::string> result;
std::string::size_type const pos_first_space = line.find(" ");
if (pos_first_space == std::string::npos)
{
// error, no space found
}
std::string const first_token = line.substr(0, pos_first_space);
result.push_back(first_token);
// ...
return result;
}
重点是:分开读取一行与标记一行。
关于C++ getline() 读取文件行无限循环遍历文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22720090/
main = do input [f a] -> f [a] sequenceA [] = pure [] sequenceA (x:xs) = (:) x sequenceA xs 很
while(getline()) 和 while(!getline().eof()) 有什么区别? 正在解析输入字符串。我尝试了两种条件检查,结果有所不同。 std::string testStr =
我知道我知道。以前有人问过这个问题,但我查看了所有答案,但似乎没有一个能解决我的问题。当我使用 getline 函数获取文件中一行的内容时,它不起作用。 getline(file, line); '文
使用 getline() 函数时出现以下错误: 没有重载函数“getline”的实例匹配参数列表 在一个名为“Time”的类中,我在读取以下输入时使用它: istream & operator >>
我正在阅读 C++ 入门书并尝试所有代码示例。我对这个很感兴趣: #include #include using std::string; using std::cin; using std::c
#include #include #include using namespace std; int main() { char d,a[9],e[9]; cin.getline(a,9); c
假设我想从控制台读取一个整数,并且我不希望程序在输入非整数字符时中断。这就是我的做法: #include #include #include using namespace std; int m
这可能不是一个错误,但我不知道出了什么问题。我的第一个条目在第二次迭代中对 str1 重复,并且从那时起也是如此。只有第一次迭代顺利。 #include #include using namesp
string text; getline(text.c_str(),256); 1) 我收到错误消息“错误:没有匹配函数来调用‘getline(const char*, int)”上面有什么问题,因为
哪个更好,更受欢迎?我真的发现阅读 API 令人困惑。 最佳答案 成员(member)版读入char*,免费版读入std::string。所以更喜欢免费版!像这样使用它: std::istream &
我正在尝试解决这个问题,但出于某种原因,我一直收到这个问题: no instance of "getline" matches the argument list. 我查过这个问题,很多次是因为人们使
长话短说 使用 libc++ 版本的 getline 函数的程序在从管道读取输入时会阻塞,直到管道的缓冲区已满。 NOT libstdc++ 版本的 getline 函数也是如此:这里函数立即读取并返
我的程序的一部分: #include #include #include #include #include using namespace std; /* Works for istrin
我是一名正在准备期末考试的 C++ 初学者。我用两种方式写了一个程序。第一个代码使用 cin.getline() 并且不能正常工作。第二个代码使用 cin.get() 和 cin >> 并正确执行所有
我正在尝试使用 getline 解析文档以获取整行并将其放入名为“line”的字符串变量中。问题是我收到一条错误消息:“没有重载函数 getline 的实例与参数列表匹配。”谁能帮我解决这个问题? #
我有一个带有 getline 函数的源代码文件,当我编译它时收到错误(下面的代码和错误)。我的问题是我从一个已经编译和工作的程序(也包括在下面)中复制并粘贴了整个函数。我在程序的其他 2 个源代码文件
我正在尝试从文件中读取,但 C++ 不想运行 getline()。 我收到这个错误: C:\main.cpp:18: error: no matching function for call to '
例子: std::ifstream in("some_file.txt"); std::string line; // must be outside ? while(getline(in,line)
注意:已解决,问题不是 getline() 而是 find 函数数组填充不当! 在发布我自己的问题之前,我已经查找了几个问题,但找不到我的问题的答案。这是我发布的第一个问题,但在发布我自己的问题之前,
我的代码块中有一个 getline 函数。但是在编译 make 文件时出现以下错误: cc -DMAIN -c -o terp.o terp.c terp.c:130:15: error: con
我是一名优秀的程序员,十分优秀!