我已经看过如何从字符串中删除特定的字符,但我不知道如何打开文件或者如果你甚至可以这样做。基本上一个文件将打开其中的任何内容,我的目标是删除所有可能出现的字母a-z,特殊字符和空格,以便剩下的就是我的数字。您可以轻松删除所有字符,而不是在文件打开时指定a,b,c等,还是必须将其转换为字符串?在内存中这样做会更好吗?
我的代码如下:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main() {
string filename;
cout << "Enter the name of the data file to open" << endl;
cin >> filename >> endl;
ofstream myfile;
myfile.open(filename);
if (myfile.is_open()) { //if file is open then
while(!myfile.eof()){ //while not end of file
//remove all chars, special and whitespace
}
}
else{
cout << "Error in opening file" << endl;
}
return 0;
}
答案 0 :(得分:0)
初步评论
如果我理解得很好,你只想保留数字。也许更容易保留ascii数字的字符并消除其他字符,而不是消除许多其他字符类,并希望其余的只是数字。
也永远不要在eof
上循环读取文件。转而在流上循环。
最后,您应该从ifstream
读取并写入ofstream
第一种方法:阅读字符串
您可以逐行读取/写入文件。您需要足够的内存来存储最大的行,但您可以从缓冲效果中受益。
if (myfile.is_open()) { //if file is open then
string line;
while(getline(myfile, line)){ //while succesful read
line.erase(remove_if(line.begin(), line.end(), [](const char& c) { return !isdigit(c); } ), line.end());
... // then write the line in the output file
}
}
else ...
第二种方法:阅读字符
您可以通过char读取/写入char,这为处理单个字符(切换字符串标志等)提供了非常灵活的选项。您也可以从缓冲中受益,但是每个char都有函数调用overhaead。
if (myfile) { //if file is open then
int c;
while((c = myfile.get())!=EOF){ //while succesful read
//remove all chars, special and whitespace
if (isdigit(c) || c=='\n')
... .put(c); // then write the line in the output file
}
}
else ...
其他方法
您还可以读取大型固定大小的缓冲区,并且与字符串一样操作(但不要消除LF)。优点是内存需求不受文件中某些非常大的行的影响。
您还可以确定文件大小,并尝试一次(或非常大的块)读取完整文件。然后,您将以内存消耗为代价最大限度地提高性能。
答案 1 :(得分:-2)
这只是一个示例,以便从具有专用过滤器的文件中提取所需的所有字符:
std::string get_purged_file(const std::string& filename) {
std::string strbuffer;
std::ifstream infile;
infile.open(filename, std::ios_base::in);
if (infile.fail()) {
// throw an error
}
char c;
while ((infile >> c).eof() == false) {
if (std::isdigit(c) || c == '.') {
strbuffer.push_back(c);
}
}
infile.close();
return strbuffer;
}
注意:这只是一个示例,必须进行优化。只是为了给你一个想法:
一旦你有缓冲区&#34;清除&#34;您可以在将内容保存到另一个文件时覆盖您的文件。