C ++如何从文件

时间:2016-08-31 19:50:15

标签: c++ char fstream

我已经看过如何从字符串中删除特定的字符,但我不知道如何打开文件或者如果你甚至可以这样做。基本上一个文件将打开其中的任何内容,我的目标是删除所有可能出现的字母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;
}

2 个答案:

答案 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 ...

Online demo

第二种方法:阅读字符

您可以通过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 ...

Online demo

其他方法

您还可以读取大型固定大小的缓冲区,并且与字符串一样操作(但不要消除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;您可以在将内容保存到另一个文件时覆盖您的文件。