如何只将文件中的整数读入也有字符串的 C++ 程序中?
How do I read only integers from a file into a c++ program that also has strings?
我有一个包含数字(整数)和单词的文件,我只想读取整数,
如果宏令人讨厌,请忽略它们,但是我只需要整数,但我必须确保还读取字符串然后忽略它们
我要在这里修改什么:
#include <iostream>
#include <vector>
#include <cmath>
#include <fstream>
using namespace std;
int main(){
FastIO;
ifstream fin("input.txt",ios::in);
int minsal =10000000;
int num;
cout<<minsal;
fin.close();
ofstream fout("output.txt",ios::out);
fout.close();
return 0;
}
示例文件可以是:
Vineel Phatak, 520, Amkart, NOBODY
Ajay Joshi, 250, Amkart, Vineel Phatak
Abhishek Chauhan, 120, Amkart, Ajay Joshi
Jayesh Godse, 500, Airflix, NOBODY
Vijaya Mundada, 60, Amkart, Abhishek Chauhan
Shital Tuteja, 45, Airflix, Jayesh Godse
Rajan Gawli, 700, Amkart, Vineel Phatak
Sheila Rodrigues, 35, Amkart, Vineel Phatak
Zeba Khan, 300, Airflix, Jayesh Godse
Chaitali Sood, 100, Airflix, Zeba Khan
您需要逐行获取输入文件,然后在每一行中从中获取数字,这是一个示例,说明如何使用 regex[=17= 从行中获取一个或多个数字] :
#include <iostream>
#include <regex>
using namespace std;
int main() {
int x;
string s = "aaa 123 zefdz";
smatch sm;
regex r = regex("\d+");
regex_search(s, sm, r);
for (string s : sm) {
x = atoi(s.c_str());
cout << "x : " << x;
}
}
在这种情况下,结果将是:
x : 123
您可以将文本文件中的值读取到字符串向量中。从那里您可以使用标准库及其算法从字符串中提取整数。在这个特定的解决方案中,我选择仅使用 <regex>
库来协助字符的模式匹配。 <regex>
的使用实际上并没有从字符串中提取值,也没有转换它,它只是检查数字是否存在......这不适用于每个用例......例如,如果一个字符串包含:"abc123def456"
,这个特定的实现将 return 一个 123456
的整数值。您可以修改它以满足您的特定需求。您可以搜索正则表达式以了解如何进行模式匹配并查找给定字符串中的特定字符或字符序列。这只是为了说明如何使用该库来提供此类功能。
#include <fstream>
#include <iostream>
#include <optional>
#include <regex>
// #include <sstream> // not used in this implementation
#include <string>
#include <vector>
std::vector<std::string> readFromFile(const char* filename) {
std::fstream file(filename, std::ios::in);
std::vector<string> contents;
std::string line;
if ( file.is_open() ) {
while ( getline(file, line) )
contents.push_back(line);
file.close();
}
return contents;
}
static const std::regex digits("([0-9])");
bool matches(const std::string& s, const std::regex& regex ) {
std::smatch base_match;
return std::regex_match(s, base_match, regex);
}
int parseString( const std::string& data ) {
std::string temp;
for (auto& c : data) {
if (matches(std::string{c}, digits))
temp.push_back(c);
}
return std::stoi(temp);
}
int main() {
std::vector<std::string> fileContents = readFromFile("sample.txt");
std::vector<int> extractedData;
for (auto& s : fileContents)
extractedData.push_back(parseString(s));
for (auto& i : extractedData)
std::cout << i << ' ';
std::cout << '\n';
// This is to demonstrate that care needs to be taken!!!
const std::string garbage{ "Hello 123 World456!" };
auto res = parseString(garbage);
std::cout << res << '\n';
return 0;
}
使用您提供的示例数据集,我能够将其作为结果以及垃圾字符串的结果打印到控制台...
520 250 120 500 60 45 700 35 300 100
123456
还有其他方法可以解决这个问题,许多人会选择将 <sstream>
与 std::stringstream
或 std::istringstream
结合使用,因为他们可以在不使用正则表达式的情况下执行类似的操作。
我有一个包含数字(整数)和单词的文件,我只想读取整数, 如果宏令人讨厌,请忽略它们,但是我只需要整数,但我必须确保还读取字符串然后忽略它们 我要在这里修改什么:
#include <iostream>
#include <vector>
#include <cmath>
#include <fstream>
using namespace std;
int main(){
FastIO;
ifstream fin("input.txt",ios::in);
int minsal =10000000;
int num;
cout<<minsal;
fin.close();
ofstream fout("output.txt",ios::out);
fout.close();
return 0;
}
示例文件可以是:
Vineel Phatak, 520, Amkart, NOBODY
Ajay Joshi, 250, Amkart, Vineel Phatak
Abhishek Chauhan, 120, Amkart, Ajay Joshi
Jayesh Godse, 500, Airflix, NOBODY
Vijaya Mundada, 60, Amkart, Abhishek Chauhan
Shital Tuteja, 45, Airflix, Jayesh Godse
Rajan Gawli, 700, Amkart, Vineel Phatak
Sheila Rodrigues, 35, Amkart, Vineel Phatak
Zeba Khan, 300, Airflix, Jayesh Godse
Chaitali Sood, 100, Airflix, Zeba Khan
您需要逐行获取输入文件,然后在每一行中从中获取数字,这是一个示例,说明如何使用 regex[=17= 从行中获取一个或多个数字] :
#include <iostream>
#include <regex>
using namespace std;
int main() {
int x;
string s = "aaa 123 zefdz";
smatch sm;
regex r = regex("\d+");
regex_search(s, sm, r);
for (string s : sm) {
x = atoi(s.c_str());
cout << "x : " << x;
}
}
在这种情况下,结果将是:
x : 123
您可以将文本文件中的值读取到字符串向量中。从那里您可以使用标准库及其算法从字符串中提取整数。在这个特定的解决方案中,我选择仅使用 <regex>
库来协助字符的模式匹配。 <regex>
的使用实际上并没有从字符串中提取值,也没有转换它,它只是检查数字是否存在......这不适用于每个用例......例如,如果一个字符串包含:"abc123def456"
,这个特定的实现将 return 一个 123456
的整数值。您可以修改它以满足您的特定需求。您可以搜索正则表达式以了解如何进行模式匹配并查找给定字符串中的特定字符或字符序列。这只是为了说明如何使用该库来提供此类功能。
#include <fstream>
#include <iostream>
#include <optional>
#include <regex>
// #include <sstream> // not used in this implementation
#include <string>
#include <vector>
std::vector<std::string> readFromFile(const char* filename) {
std::fstream file(filename, std::ios::in);
std::vector<string> contents;
std::string line;
if ( file.is_open() ) {
while ( getline(file, line) )
contents.push_back(line);
file.close();
}
return contents;
}
static const std::regex digits("([0-9])");
bool matches(const std::string& s, const std::regex& regex ) {
std::smatch base_match;
return std::regex_match(s, base_match, regex);
}
int parseString( const std::string& data ) {
std::string temp;
for (auto& c : data) {
if (matches(std::string{c}, digits))
temp.push_back(c);
}
return std::stoi(temp);
}
int main() {
std::vector<std::string> fileContents = readFromFile("sample.txt");
std::vector<int> extractedData;
for (auto& s : fileContents)
extractedData.push_back(parseString(s));
for (auto& i : extractedData)
std::cout << i << ' ';
std::cout << '\n';
// This is to demonstrate that care needs to be taken!!!
const std::string garbage{ "Hello 123 World456!" };
auto res = parseString(garbage);
std::cout << res << '\n';
return 0;
}
使用您提供的示例数据集,我能够将其作为结果以及垃圾字符串的结果打印到控制台...
520 250 120 500 60 45 700 35 300 100
123456
还有其他方法可以解决这个问题,许多人会选择将 <sstream>
与 std::stringstream
或 std::istringstream
结合使用,因为他们可以在不使用正则表达式的情况下执行类似的操作。