为什么 getline() 不读取文本文件中的所有内容?
Why is getline() not reading all content in text file?
我正在使用 ifstream
和 getline
来读取整数文本文件中的所有输入。输入被构造为邻接矩阵。现在我无法读取每行中第一个 space 之后的剩余数字。
** 我试过示例输入并确认它只打印每行中的第一个数字 (row[0...n], col[0])。
示例输入:
0 1 0
1 0 1
0 1 0
示例输出:
0
1
0
这里是源代码:
// Prompt user for input
cout <<"\nEnter filename: ";
cin >> fileName;
cout << "Enter a start vertex: ";
cin >> startVertex;
// Assume max size is 25 vertices
pointer = new int[25];
// Fill pointer with contents
ifstream newFile(fileName);
int x = 0;
while(getline(newFile, fileName)){
pointer[x] = stoi(fileName); //cast string to int
x++;
}
newFile.close();
cout << "Count = " << count << endl; //Test counter
for (int i = 0; i < x; i++){
cout << pointer[i] << " " << endl; // Test pointer contents
}
std::getline()
读取整行输入,例如它读取 "0 1 0"
(第一行)。
然后 std::stoi
的(有点令人惊讶的)行为开始发挥作用:
Discards any whitespace characters (as identified by calling isspace()) until the first non-whitespace character is found, then takes as many characters as possible to form a valid base-n (where n=base) integer number representation and converts them to an integer value. The valid integer value consists of the following parts:
这意味着,stoi
只解析第一个数字 0
和 returns 它。因此,您只解析每行的第一个数字。
您需要按元素而不是按行读取文件:
ifstream newFile(fileName);
int val;
int x = 0;
while(newFile >> val){
pointer[x] = val;
x++;
}
newFile.close();
作为一个不相关的补充:想想当文件包含超过 25 个条目时会发生什么。考虑使用 std::vector
而不是普通数组。
我正在使用 ifstream
和 getline
来读取整数文本文件中的所有输入。输入被构造为邻接矩阵。现在我无法读取每行中第一个 space 之后的剩余数字。
** 我试过示例输入并确认它只打印每行中的第一个数字 (row[0...n], col[0])。
示例输入:
0 1 0
1 0 1
0 1 0
示例输出:
0
1
0
这里是源代码:
// Prompt user for input
cout <<"\nEnter filename: ";
cin >> fileName;
cout << "Enter a start vertex: ";
cin >> startVertex;
// Assume max size is 25 vertices
pointer = new int[25];
// Fill pointer with contents
ifstream newFile(fileName);
int x = 0;
while(getline(newFile, fileName)){
pointer[x] = stoi(fileName); //cast string to int
x++;
}
newFile.close();
cout << "Count = " << count << endl; //Test counter
for (int i = 0; i < x; i++){
cout << pointer[i] << " " << endl; // Test pointer contents
}
std::getline()
读取整行输入,例如它读取 "0 1 0"
(第一行)。
然后 std::stoi
的(有点令人惊讶的)行为开始发挥作用:
Discards any whitespace characters (as identified by calling isspace()) until the first non-whitespace character is found, then takes as many characters as possible to form a valid base-n (where n=base) integer number representation and converts them to an integer value. The valid integer value consists of the following parts:
这意味着,stoi
只解析第一个数字 0
和 returns 它。因此,您只解析每行的第一个数字。
您需要按元素而不是按行读取文件:
ifstream newFile(fileName);
int val;
int x = 0;
while(newFile >> val){
pointer[x] = val;
x++;
}
newFile.close();
作为一个不相关的补充:想想当文件包含超过 25 个条目时会发生什么。考虑使用 std::vector
而不是普通数组。