用C++从文件中的一行读取数字

reading numbers from line in a file in C++

本文关键字:一行 读取 数字 C++ 文件      更新时间:2024-09-22

我有一个函数process_input,它基本上获取文件的一行并打印该行的数字,如果它有2个数字,它会打印这些数字,否则它会打印3个数字。

我的问题是,出于某种原因,它使用-1令牌重复打印行,我明白了原因。我的逻辑有什么错误吗?或者我遗漏了什么,有没有更有效的方法来做到这一点?我真正想要的是从文件中得到号码。

文件:

4 4
6 4
5 10
10 3
4 8
1 2 5
2 3 6
2 4 2
3 4 1

我的输出:

4 4 - tokens: 2
6 4 0 - tokens: 2
5 10 0 - tokens: 2
10 3 0 - tokens: 2
4 8 0 - tokens: 2
1 2 5 - tokens: 3
1 2 5 - tokens: -1
2 3 6 - tokens: 3
2 3 6 - tokens: -1
2 4 2 - tokens: 3
2 4 2 - tokens: -1
3 4 1 - tokens: 3
3 4 1 - tokens: -1
3 4 1 - tokens: -1

正确输出:

4 4 - tokens: 2
6 4 0 - tokens: 2
5 10 0 - tokens: 2
10 3 0 - tokens: 2
4 8 0 - tokens: 2
1 2 5 - tokens: 3
2 3 6 - tokens: 3
2 4 2 - tokens: 3
3 4 1 - tokens: 3

程序:

#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <stack>
using namespace std;
void process_input(int** &graph, int &V, int &E)
{
int n,k;
char line[6];
fgets(line,6,stdin);
int tokens = sscanf(line, "%d %d", &n, &k);
printf("%d %d - tokens: %dn",n,k,tokens);
int x,y,w = 0;
while (fgets(line,6,stdin) != NULL)
{
tokens = sscanf(line, "%d %d %d", &x,&y,&w);
printf("%d %d %d - tokens: %dn",x,y,w,tokens);
}
}
int main(int argc, char **argv)
{
int V, E;
int **graph;
process_input(graph,V,E);
exit(0);
}

问题是,一旦在循环中输入数字,就不会清除stdin缓冲区。这里有CC++的混合。

在C++中,你可以这样做:

while (fgets(line,6,stdin) != NULL)
{   
tokens = sscanf(line, "%d %d %d", &x,&y,&w);
printf("%d %d %d - tokens: %dn",x,y,w,tokens);
std::cin.ignore();
std::cin.clear();
}

您必须包括iostream。使用C的方式并不完美,但这里有关于它的的SO帖子

在更仔细的检查中使用十六进制输出(这是针对C的,您正在覆盖n。这使得scanf功能失败,这就是为什么您得到-1,为什么它没有自己清除缓冲区。

int n,k;
char line[7];
fgets(line,7,stdin);
int tokens = sscanf(line, "%d %d", &n, &k);
printf("%d %d - tokens: %dn",n,k,tokens);
int x,y,w = 0;                                                                                                                                            
while (fgets(line,7,stdin) != NULL)
{
tokens = sscanf(line, "%d %d %dn", &x,&y,&w);
printf("%d %d %d - tokens: %dn",x,y,w,tokens);
}