C++ ifstream只读一个字的个数
C++ ifstream read only number of a word
所以我想从 .txt 文件中读取整数形式的数字。
file.txt:
hello 123-abc
world 456-def
当前代码:
int number;
ifstream file("file.txt");
while (!file.eof())
{
file >> number; //123, 456
}
现在这显然行不通,我一直在努力解决这个问题 "while" 但我就是无法解决这个问题。
您需要检查文件是否打开,然后获取当前行,然后解析当前行以获取第一个数字:
std::string currentLine = "";
std::string numbers = "";
ifstream file("file.txt");
if(file.is_open())
{
while(std::getline(file, currentLine))
{
int index = currentLine.find_first_of(' '); // look for the first space
numbers = currentLine.substr(index + 1, xyz);
}
}
xyz 是数字的长度(在本例中为 3,如果始终不变)或者您可以通过从 (index, currentLine.back() - index);
获取子字符串来查找下一个空白 space
我相信你能想出剩下的,祝你好运。
有多种方法可以做到这一点。您尝试过的方法不起作用,因为流中的读取位置没有 number-like 东西。所以输入会失败,流的fail-bit会被设置。你将永远循环,因为你只测试 eof。 Read this 获取更多信息。
一种简单的方法是一次读取一行,然后利用 std::strtol
的第二个参数搜索第一个数字:
#include <iostream>
#include <string>
#include <experimental/optional>
std::experimental::optional<int> find_int_strtol( const std::string & s )
{
for( const char *p = s.c_str(); *p != '[=10=]'; p++ )
{
char *next;
int value = std::strtol( p, &next, 10 );
if( next != p ) {
return value;
}
}
return {};
}
int main()
{
for( std::string line; std::getline( std::cin, line ); )
{
auto n = find_int_strtol( line );
if( n )
{
std::cout << "Got " << n.value() << " in " << line << std::endl;
}
}
return 0;
}
这有点笨拙,它还会检测底片,这可能是您不想要的。但这是一个简单的方法。如果提取了任何字符,next
指针将不同于 p
。否则函数失败。然后将 p
递增 1 并再次搜索。它看起来像多项式搜索,但它是线性的。
我使用了 C++17 中的 std::optional
,但我是在 C++14 编译器上测试的。是为了方便。您可以在没有它的情况下编写函数。
实例is here.
解决此类问题的一种更灵活的方法是使用正则表达式。在这种情况下,您只需要一个简单的数字正则表达式搜索。以下将仅查找正整数,但您也可以使用这种类型的模式来查找复杂数据。不要忘记包含 header <regex>
:
std::experimental::optional<int> find_int_regex( const std::string & s )
{
static const std::regex r( "(\d+)" );
std::smatch match;
if( std::regex_search( s.begin(), s.end(), match, r ) )
{
return std::stoi( match[1] );
}
return {};
}
实例is here.
逐行读取并删除所有不是数字的字符。在推送到 std::vector
.
之前以 std::stoi
结束
std::ifstream file{"file.txt"};
std::vector<int> numbers;
for (std::string s; std::getline(file, s);) {
s.erase(std::remove_if(std::begin(s), std::end(s),
[] (char c) { return !::isdigit(c); }), std::end(s));
numbers.push_back(std::stoi(s));
}
或者使用 std::regex_replace
删除非数字字符:
auto tmp = std::regex_replace(s, std::regex{R"raw([^\d]+(\d+).+)raw"}, "");
numbers.push_back(std::stoi(tmp));
所以我想从 .txt 文件中读取整数形式的数字。
file.txt:
hello 123-abc
world 456-def
当前代码:
int number;
ifstream file("file.txt");
while (!file.eof())
{
file >> number; //123, 456
}
现在这显然行不通,我一直在努力解决这个问题 "while" 但我就是无法解决这个问题。
您需要检查文件是否打开,然后获取当前行,然后解析当前行以获取第一个数字:
std::string currentLine = "";
std::string numbers = "";
ifstream file("file.txt");
if(file.is_open())
{
while(std::getline(file, currentLine))
{
int index = currentLine.find_first_of(' '); // look for the first space
numbers = currentLine.substr(index + 1, xyz);
}
}
xyz 是数字的长度(在本例中为 3,如果始终不变)或者您可以通过从 (index, currentLine.back() - index);
我相信你能想出剩下的,祝你好运。
有多种方法可以做到这一点。您尝试过的方法不起作用,因为流中的读取位置没有 number-like 东西。所以输入会失败,流的fail-bit会被设置。你将永远循环,因为你只测试 eof。 Read this 获取更多信息。
一种简单的方法是一次读取一行,然后利用 std::strtol
的第二个参数搜索第一个数字:
#include <iostream>
#include <string>
#include <experimental/optional>
std::experimental::optional<int> find_int_strtol( const std::string & s )
{
for( const char *p = s.c_str(); *p != '[=10=]'; p++ )
{
char *next;
int value = std::strtol( p, &next, 10 );
if( next != p ) {
return value;
}
}
return {};
}
int main()
{
for( std::string line; std::getline( std::cin, line ); )
{
auto n = find_int_strtol( line );
if( n )
{
std::cout << "Got " << n.value() << " in " << line << std::endl;
}
}
return 0;
}
这有点笨拙,它还会检测底片,这可能是您不想要的。但这是一个简单的方法。如果提取了任何字符,next
指针将不同于 p
。否则函数失败。然后将 p
递增 1 并再次搜索。它看起来像多项式搜索,但它是线性的。
我使用了 C++17 中的 std::optional
,但我是在 C++14 编译器上测试的。是为了方便。您可以在没有它的情况下编写函数。
实例is here.
解决此类问题的一种更灵活的方法是使用正则表达式。在这种情况下,您只需要一个简单的数字正则表达式搜索。以下将仅查找正整数,但您也可以使用这种类型的模式来查找复杂数据。不要忘记包含 header <regex>
:
std::experimental::optional<int> find_int_regex( const std::string & s )
{
static const std::regex r( "(\d+)" );
std::smatch match;
if( std::regex_search( s.begin(), s.end(), match, r ) )
{
return std::stoi( match[1] );
}
return {};
}
实例is here.
逐行读取并删除所有不是数字的字符。在推送到 std::vector
.
std::stoi
结束
std::ifstream file{"file.txt"};
std::vector<int> numbers;
for (std::string s; std::getline(file, s);) {
s.erase(std::remove_if(std::begin(s), std::end(s),
[] (char c) { return !::isdigit(c); }), std::end(s));
numbers.push_back(std::stoi(s));
}
或者使用 std::regex_replace
删除非数字字符:
auto tmp = std::regex_replace(s, std::regex{R"raw([^\d]+(\d+).+)raw"}, "");
numbers.push_back(std::stoi(tmp));