如何从文件中读取用空格分隔的数字
How to read numbers separated with space from a file
我有一个文本文件,里面有数字,第一个数字是用不同的数字系统写的一些数字,然后有一个空格,然后有另一个数字-这是第一个数字的基数。例如:
1011011 2
1212011 3
1AB13 12
etc...
我必须使用我已有的函数将文件中的所有数字转换为十进制。它有两个变量,第一个是用不同的数字系统写的数字,另一个是该系统的基础,然后它将该数字转换为十进制,并将其写入另一个文件。
如何从文件中读取数据,使第一个数字指向第一个变量,基数指向第二个变量?
有很多可能的解决方案。有些更好,有些不那么好。这在一定程度上取决于您的要求。
无论如何,我更喜欢C++中更面向对象的方法。所以,我们有数据,就像一个由数字和基数组成的字符串。我们想以某种方式将其拆分,并提取一个基础。最后,我们想计算出一个十进制数。
因此,我们可以定义一个小类,例如NumberAndBase。这个类知道如何读取和写入数据。其他人不应该知道这一点。这可以以某种方式封装。作为一种解决方案,我们将覆盖我们的小类的插入器和提取器运算符。
然后我们可以简单地读写这样的数据:
NumberAndBase nab{};
std::cin >> nab;
std::cout << nab << "nn";
这当然适用于每个iostream
。CCD_ 2和CCD_。
但是您想要读取存储在文件中的更多数据。因此,您可以通过简单地读取数据并将它们放入std::vector
中来实现这一点。像这样:
std::vector<NumberAndBase> data{ std::istream_iterator<NumberAndBase>(sourceFile), std::istream_iterator<NumberAndBase>() };
这定义了变量数据并使用其范围构造函数。对于开始和结束,我们将使用std::istream_iterator
。这将调用类的inserter运算符,并读取和转换所有值。
现在我将向您展示一个完整的示例。请注意。我在SO上没有文件,所以我用std::istringstream
代替,但你当然可以用任何std::ifstream
或任何你想要的std::istream
交换。
#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <iterator>
#include <iomanip>
#include <vector>
unsigned long yourConversionFunction(std::string& s, unsigned int b) {
return std::stoul(s, 0, b);
}
struct NumberAndBase {
NumberAndBase() {}
explicit NumberAndBase(std::string& s) : numberAsString(s), base(), result() { convert(s); }
explicit NumberAndBase(std::string& s, unsigned int b) : numberAsString(s), base(b), result() { result = yourConversionFunction(s,b); }
unsigned long convert(std::string& s) {
std::istringstream iss(s); iss >> numberAsString >> base;
result = yourConversionFunction(numberAsString, base);
return result;
}
// Extractor. Read number and base, separated by space
friend std::istream& operator >> (std::istream& is, NumberAndBase& nab) {
std::string line{};
if (std::getline(is, line)) nab.convert(line);
return is;
}
// Inserter: Show result
friend std::ostream& operator << (std::ostream& os, const NumberAndBase& nab) {
return os << std::left << std::setw(16) << nab.numberAsString << " (" << std::setw(2) << nab.base << ") --> " << nab.result;
}
// Data
std::string numberAsString{};
unsigned int base{ 10 };
unsigned long result{ 0 };
};
std::istringstream sourceFile{ R"(10011010010 2
1200201 3
103102 4
14414 5
5414 6
3412 7
2322 8
1621 9
1234 10
a22 11
86a 12
73c 13
642 14
574 15
4d2 16
44a 17
3ea 18
37i 19
31e 20)" };
int main() {
// Read all data
std::vector<NumberAndBase> data{ std::istream_iterator<NumberAndBase>(sourceFile), std::istream_iterator<NumberAndBase>() };
// Show result
std::copy(data.begin(), data.end(), std::ostream_iterator<NumberAndBase>(std::cout, "n"));
return 0;
}
当然,您可以将这两条主语句合并为一条(如果您只想显示结果(
int main() {
std::copy(
std::istream_iterator<NumberAndBase>(sourceFile),
std::istream_iterator<NumberAndBase>(),
std::ostream_iterator<NumberAndBase>(std::cout, "n"));
return 0;
}
如前所述。众多可能的解决方案之一。我还添加了一些构造函数和其他东西(在这个例子中不需要,只是为了给你一个想法(。这可以根据您的需要进行调整。
即将完成:程序的结果
10011010010 (2 ) --> 1234
1200201 (3 ) --> 1234
103102 (4 ) --> 1234
14414 (5 ) --> 1234
5414 (6 ) --> 1234
3412 (7 ) --> 1234
2322 (8 ) --> 1234
1621 (9 ) --> 1234
1234 (10) --> 1234
a22 (11) --> 1234
86a (12) --> 1234
73c (13) --> 1234
642 (14) --> 1234
574 (15) --> 1234
4d2 (16) --> 1234
44a (17) --> 1234
3ea (18) --> 1234
37i (19) --> 1234
31e (20) --> 1234
您可以通过std::ifstream::operator>>
将数字读取为字符串,然后将其基数读取为数字。然后你可以转换到基数10。
#include <fstream>
#include <iostream>
std::ifstream ifs("test.txt");
std::string num;
int base;
while (ifs >> num >> base)
{
std::cout << num << " in base " << base << "n";
}
- 如何在C++中读取空格分隔的输入 当我们不知道输入的数量时
- 如何将以逗号和空格分隔的整数读取到 2D 数组中?
- 如何逐行读取文件,每行中的内容都用空格分隔并将其写入新文件中
- 用于存储由空格分隔的字符串的 C++/C 数据结构
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- 野牛/yacc 解析器在不被空格分隔时跳过 grammer - "unexpected $end"
- 从 stdio 获取一行空格分隔的整数,而不知道它们是多少 (C++)
- 如何从文件中读取用空格分隔的数字
- 反转由空格分隔的字符串元素将返回比原始字符串更大的字符串
- 获取由空格分隔的未知大小的单行输入,并将其存储到整数数组中
- 如果用户输入两个或多个由空格分隔的字符串C++如何防止缓冲区溢出?
- 使用 fstream 在空格分隔文件中查看下一项(不仅仅是一个字符)的方法
- 非空格分隔的文本文件到 2D 矢量
- 如何在用空格分隔的行中获得无限的输入
- 如何从空格分隔的单个字符串中提取多个子字符串
- 如何获得一些用空格分隔的字符
- 在 cpp 中使用 getline 输入数组中的空格分隔数字
- C++ sscanf 空格分隔字符串
- 文本文件解析C++|用空格分隔
- 将空格分隔的输入读取到C++中的数组中