c++ 在找到空白 space 时将文件拆分为记录?
c++ split a file into records when blank space is found?
我有一个这样的文件
2.7388 0 2.4670
3.6384 1 24.5927
8.7844 0 10.6871
11.2892 0 2.6507
19.6054 1 16.8974
25.8811 0 8.0084
例如,我将占据第一行 2.7388 0 2.4670
。我正在尝试完成类似以下的事情
2.7388 = double x
0 = int y
2.4670 = double z
我的尝试
struct fileReader{
double x;
int y;
double z;
};
std::vector<fileReader> afileReader(std::string fileName) {
std::vector<fileReader> readtheFile;
std::ifstream List;
std::string line;
List.open(fileName);
char delimiter = ' '; //delimiter added
while (std::getline(List, line))
{
line.pop_back();
std::string token;
std::istringstream ss(line);
fileReader afileReader;
std::getline(ss, token,delimiter);
afileReader.x = std::stod(token); //change from stoi to stod
std::getline(ss, token,delimiter);
afileReader.y = std::stoi(token);
std::getline(ss, token,delimiter);
afileReader.z = std::stod(token); //change from stoi to stod
readtheFile.push_back(std::move(afileReader));
}
for(fileReader x: readtheFile) {
std::cout << x.x;
std::cout << x.y;
std::cout << x.z;
}
return readtheFile;
passengerList.close();
}
当我 运行 从主线 运行 宁行 afileReader("file.txt")
。我收到以下错误
terminate called after throwing an instance of 'std::invalid_argument'
what(): stod //error changed
Aborted (core dumped)
我不确定为什么我收到 stoi 错误,因为它是将 int 值转换为字符串的正确转换方法(因为标记是字符串)
虽然我希望在命中空白 space 时拆分记录,但要返回到问题。因此,回到前面的 2.7388 0 2.4670
示例,当 2.7388
被读取时,它被分配给变量 x
,当 0
被读取时,它被分配给变量 y
并且2.4670
赋值给变量 z
(推荐)更直接的方法:
#include <fstream>
#include <iostream>
#include <vector>
struct Data {
double x;
int y;
double z;
};
std::vector<Data> fileReader(std::string fileName) {
std::vector<Data> result;
std::ifstream file(fileName);
Data data;
while (file >> data.x >> data.y >> data.z)
result.push_back(data);
for (auto &&i : result)
std::cout << i.x << ' ' << i.y << ' ' << i.z << '\n';
return result;
}
int main() { fileReader("test.txt"); }
您的原始代码有问题:
fileReader::x
和 fileReader::z
不是 floating-type 数字。
' '
未作为定界符传递给 std::getline
。
- 您正在阅读的文件中的间距不一致。 (FIX)
- 出于某种奇怪的原因,你正在做
line.pop_back()
;
- [某些警告的原因]您没有从
afileReader()
(non-void 函数)返回任何内容。
固定代码:
#include <fstream>
#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
struct fileReader {
double x;
int y;
double z;
};
std::vector<fileReader> afileReader(std::string fileName) {
std::vector<fileReader> readtheFile;
std::ifstream List(fileName);
std::string line;
while (std::getline(List, line)) {
std::string token;
std::istringstream ss(line);
fileReader afileReader;
ss >> std::ws;
std::getline(ss, token, ' ');
afileReader.x = std::stod(token);
ss >> std::ws;
std::getline(ss, token, ' ');
afileReader.y = std::stoi(token);
ss >> std::ws;
std::getline(ss, token);
afileReader.z = std::stod(token);
readtheFile.push_back(std::move(afileReader));
}
for (auto &&i : readtheFile)
std::cout << i.x << ' ' << i.y << ' ' << i.z << '\n';
return readtheFile;
}
int main() { afileReader("test.txt"); }
我有一个这样的文件
2.7388 0 2.4670
3.6384 1 24.5927
8.7844 0 10.6871
11.2892 0 2.6507
19.6054 1 16.8974
25.8811 0 8.0084
例如,我将占据第一行 2.7388 0 2.4670
。我正在尝试完成类似以下的事情
2.7388 = double x
0 = int y
2.4670 = double z
我的尝试
struct fileReader{
double x;
int y;
double z;
};
std::vector<fileReader> afileReader(std::string fileName) {
std::vector<fileReader> readtheFile;
std::ifstream List;
std::string line;
List.open(fileName);
char delimiter = ' '; //delimiter added
while (std::getline(List, line))
{
line.pop_back();
std::string token;
std::istringstream ss(line);
fileReader afileReader;
std::getline(ss, token,delimiter);
afileReader.x = std::stod(token); //change from stoi to stod
std::getline(ss, token,delimiter);
afileReader.y = std::stoi(token);
std::getline(ss, token,delimiter);
afileReader.z = std::stod(token); //change from stoi to stod
readtheFile.push_back(std::move(afileReader));
}
for(fileReader x: readtheFile) {
std::cout << x.x;
std::cout << x.y;
std::cout << x.z;
}
return readtheFile;
passengerList.close();
}
当我 运行 从主线 运行 宁行 afileReader("file.txt")
。我收到以下错误
terminate called after throwing an instance of 'std::invalid_argument'
what(): stod //error changed
Aborted (core dumped)
我不确定为什么我收到 stoi 错误,因为它是将 int 值转换为字符串的正确转换方法(因为标记是字符串)
虽然我希望在命中空白 space 时拆分记录,但要返回到问题。因此,回到前面的 2.7388 0 2.4670
示例,当 2.7388
被读取时,它被分配给变量 x
,当 0
被读取时,它被分配给变量 y
并且2.4670
赋值给变量 z
(推荐)更直接的方法:
#include <fstream>
#include <iostream>
#include <vector>
struct Data {
double x;
int y;
double z;
};
std::vector<Data> fileReader(std::string fileName) {
std::vector<Data> result;
std::ifstream file(fileName);
Data data;
while (file >> data.x >> data.y >> data.z)
result.push_back(data);
for (auto &&i : result)
std::cout << i.x << ' ' << i.y << ' ' << i.z << '\n';
return result;
}
int main() { fileReader("test.txt"); }
您的原始代码有问题:
fileReader::x
和fileReader::z
不是 floating-type 数字。' '
未作为定界符传递给std::getline
。- 您正在阅读的文件中的间距不一致。 (FIX)
- 出于某种奇怪的原因,你正在做
line.pop_back()
; - [某些警告的原因]您没有从
afileReader()
(non-void 函数)返回任何内容。
固定代码:
#include <fstream>
#include <iostream>
#include <istream>
#include <sstream>
#include <vector>
struct fileReader {
double x;
int y;
double z;
};
std::vector<fileReader> afileReader(std::string fileName) {
std::vector<fileReader> readtheFile;
std::ifstream List(fileName);
std::string line;
while (std::getline(List, line)) {
std::string token;
std::istringstream ss(line);
fileReader afileReader;
ss >> std::ws;
std::getline(ss, token, ' ');
afileReader.x = std::stod(token);
ss >> std::ws;
std::getline(ss, token, ' ');
afileReader.y = std::stoi(token);
ss >> std::ws;
std::getline(ss, token);
afileReader.z = std::stod(token);
readtheFile.push_back(std::move(afileReader));
}
for (auto &&i : readtheFile)
std::cout << i.x << ' ' << i.y << ' ' << i.z << '\n';
return readtheFile;
}
int main() { afileReader("test.txt"); }