gpt4 book ai didi

c++ - 从文件中删除注释并保留整数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:34:52 27 4
gpt4 key购买 nike

我正在尝试从我的 .txt 文件中删除评论。我的文本文件如下所示:

(* Sunspot data collected by Robin McQuinn from *)
(* http://sidc.oma.be/html/sunspot.html *)

(* Month: 1749 01 *) 58
(* Month: 1749 02 *) 63
(* Month: 1749 03 *) 70
(* Month: 1749 04 *) 56

注释是 (* 和 *) 之间的所有内容。我只需要保留此文件中的 58、63、70 和 56。

我的代码删除了一些字符,但没有正确删除。我的代码如下所示:

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <fstream>
#include <string>
#include <cctype>
#include <numeric>
#include <iomanip>

using namespace std;

int main() {

int digit = 1;
string filename;
//cout for getting user path
//the compiler parses string literals differently so use a double backslash or a forward slash
cout << "Enter the path of the data file, be sure to include extension." << endl;
cout << "You can use either of the following:" << endl;
cout << "A forwardslash or double backslash to separate each directory." << endl;
getline(cin, filename);

//gets file
ifstream infile{filename};
istream_iterator<char> infile_begin{ infile };
istream_iterator<char> eof{};
vector<char> file{ infile_begin, eof };

for(int i =0; i < file.size(); i++){
if(!isdigit(file[i])) {
if(file[i] != ')') {
file.erase(file.begin(),file.begin()+i);
}
}
}
copy(begin(file), end(file), ostream_iterator<char>(cout, " "));
}

我不应该使用 vector.erase() 吗?我知道这段代码是不对的。如果是这样的话,更好的解决方案是什么?我知道在 C 中您可以将它写入内存并转到每个位置,这是更好的方法吗?

最佳答案

我会先将所有内容保存为字符串,准备字符串,然后将结果安全地 push_back 到 vector 中。现在我使用 std::regex 来过滤你的文件。不过,这并不是最简单的。

#include <iostream>
#include <string>
#include <regex>
#include <fstream>

int main(){

std::string file_name;
std::cout << "Enter name/path of the txt file: ";
std::getline(std::cin, file_name);
std::ifstream file(file_name);

std::vector<int> vec; //here save integers

std::string text; //save current line here


std::smatch match; //here the found "comment" get's saved, later to be removed from text

std::regex remove("[\(\*]\.*[\*\)] *"); //the expression to search for
//translation
// _[\(\*] -> (*
// _\.* -> any number of characters
// _[\*\)] -> *)
// _ * -> any number of whitespaces (important to cast to integer)..



while (std::getline(file, text)){ //loop through all lines in file.txt

if (std::regex_search(text, match, remove)){ //if a comment was found
text.erase(text.begin(), text.begin() + match[0].length()); //remove the comment
}

if (!text.empty()) { //empty, line was a pure comment
vec.push_back(std::stoi(text)); //else add integer to list
}
}


std::cout << "The file contains:" << std::endl;
for (int i = 0; i < vec.size(); i++){
std::cout << vec.at(i) << std::endl;
}

return 0;
}

输出:

Enter name/path of the txt file: file.txt
The file contains:
58
63
70
56

当然,使用 std::stoi 只有在整数 之后没有字符时才有效。好吧,这只是一个想法,当然可以高度修改。

关于c++ - 从文件中删除注释并保留整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39373898/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com