我想从具有以下格式的文本文件中读取行:a r3, r2, r1
并且我想将其拆分为单个部分,因此我有一个变量分别保存a,r3,r2和r1,所以我需要删除空格和逗号。我不知道该怎么做。我已经搜索过,但只能找到带有预定义字符串的示例(例如this)。
我知道如何从文件中读取文本并将其放入char数组中,但理想情况下我想将一行的每个元素放入一个单独的变量中。
类似于:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
void main()
{
string var1, var2, var3, var4;
ifstream inFile("myfile.txt");
if (inFile.is_open()){
while (!inFile.eof()){
inFile >> var1 >> var2 >> var3 >> var4;
}
}
}
但它处理空格,逗号和新行。有关如何做到这一点的任何建议吗?
答案 0 :(得分:1)
以下所有方式适合您的情况:
您可以为每个字符串使用此类例程。检查最后一个字符是否为逗号。如果是,请将其替换为&#34; empty-ness&#34;:
if (var1[var1.size() - 1] == ',')
var1.replace(var1.size() - 1, var1.size() - 1, ""); // (From index, to index, with)
如果是逗号,可以pop_back()最后一个字符:
if (var2[var2.size() - 1] == ',')
var2.pop_back();
此外,如果它是最后一个字符,您可以删除逗号:
if (var3[var3.size() - 1] == ',')
var3.erase(var3.size() - 1, var3.size() - 1); // (From index, to index)
答案 1 :(得分:1)
您可以使用std::getline(<stream>, <string>)
读取一行。
std::string line;
while(std::getline(inFile, line))
{
// You successfully read a line.
}
std::getline()
实际上有第三个参数指定行尾。默认情况下,这是'\ n',但您指定的是在线端(可以是',')。
std::stringstream lineStream(line); // convert your line into a stream.
if (std::getline(lineStream, a, ',') &&
std::getline(lineStream, r1, ',') &&
std::getline(lineStream, r2, ',') &&
std::getline(lineStream, r3, ',')
)
{
// Read all the values successfully
}
如果您的行被空格分解,请使用operator>>
而不是std::getline()
。
std::stringstream lineStream(line); // convert your line into a stream.
if (lineStream >> a >> r1 >> r2 >> r3)
{
// Read all the values successfully
}
答案 2 :(得分:0)
不是最优雅的解决方案,但这些方面的内容可行:
void parse_input(const std::string& _buffer, std::string& _s1, std::string& _s2,
std::string& _s3, std::string& _s4);
int main(void) {
std::ifstream inFile("foo.txt");
std::string var1, var2, var3, var4;
std::string buffer = "";
while(std::getline(inFile, buffer)) {
parse_input(buffer, var1, var2, var3, var4);
}
}
void parse_input(const std::string& _buffer, std::string& _s1, std::string& _s2,
std::string& _s3, std::string& _s4) {
size_t count = 0;
// increment count until first space char
while (buffer.at(count) != ' ') {
++count;
}
// set _s1 to substring of _buffer from start to first space
_s1 = _buffer.substr(0, count);
size_t prev_count = count;
// repeat above for comma char instead...
while (buffer.at(count) != ',') {
++count;
}
_s2 = _buffer.substr(prev_count, count);
prev_count = count;
while (buffer.at(count) != ',') {
++count;
}
_s3 = _buffer.substr(prev_count, count);
prev_count = count;
while (buffer.at(count) != ',') {
++count;
}
_s4 = _buffer.substr(prev_count, count);
}
请注意,这并不能防止_buffer
parse_input
参数中的索引超出范围错误 - 您需要在while
循环中添加其他检查,例如{ {1}}。