将文件读取到内存,循环数据,然后写入文件



我试图向这篇文章提出一个类似的问题:C: 将二进制文件读取到内存,更改缓冲区,将缓冲区写入文件但答案对我没有帮助(我是c++的新手,所以我不可能全部理解)

如何让循环访问内存中的数据,并逐行进行,以便将其写入不同格式的文件?

这就是我所拥有的:

#include <fstream>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
int main()
{
    char* buffer;
    char linearray[250];
    int lineposition;
    double filesize;
    string linedata;
    string a;
    //obtain the file
    FILE *inputfile;
    inputfile = fopen("S050508-v3.txt", "r");
    //find the filesize
    fseek(inputfile, 0, SEEK_END);
    filesize = ftell(inputfile);
    rewind(inputfile);
    //load the file into memory
    buffer = (char*) malloc (sizeof(char)*filesize);      //allocate mem
    fread (buffer,filesize,1,inputfile);         //read the file to the memory
    fclose(inputfile);
    //Check to see if file is correct in Memory
    cout.write(buffer,filesize);
    free(buffer);
}

我感谢任何帮助!

编辑(有关数据的更多信息):

我的数据是不同的文件,在5到10gb之间变化。大约有3亿行数据。每条线看起来都像

M359

T359 3520 359

M400

A3592 zng 392

其中第一个元素是字符,其余项目可以是数字或字符。我试着把它读入内存,因为逐行循环比读一行、处理然后写要快得多。我正在64位linux中编译。如果我需要进一步澄清,请告诉我。再次感谢。

编辑2我使用switch语句来处理每一行,其中每一行的第一个字符决定了如何格式化该行的其余部分。例如,"M"的意思是毫秒,我将接下来的三个数字放入一个结构中。每一行都有不同的第一个字符,我需要做一些不同的事情。

因此,请原谅潜在的明显问题,但如果您想逐行处理,那么。。。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
    // read lines one at a time
    ifstream inf("S050508-v3.txt");
    string line;
    while (getline(inf, line))
    {
        // ... process line ...
    }
    inf.close();
    return 0;
}

只是填充while循环的主体?也许我没有看到真正的问题(以林换树的事情)。

编辑

OP使用自定义streambuf,这可能不一定是世界上最便携的东西,但他更感兴趣的是避免在输入和输出文件之间来回切换。有了足够的RAM,这就可以了。

#include <iostream>
#include <fstream>
#include <iterator>
#include <memory>
using namespace std;
struct membuf : public std::streambuf
{
    membuf(size_t len)
        : streambuf()
        , len(len)
        , src(new char[ len ] )
    { 
        setg(src.get(), src.get(), src.get() + len);
    }
    // direct buffer access for file load.
    char * get() { return src.get(); };
    size_t size() const { return len; };
private:
    std::unique_ptr<char> src;
    size_t len;
};
int main(int argc, char *argv[])
{
    // open file in binary, retrieve length-by-end-seek
    ifstream inf(argv[1], ios::in|ios::binary);
    inf.seekg(0,inf.end);
    size_t len = inf.tellg();
    inf.seekg(0, inf.beg);
    // allocate a steam buffer with an internal block
    //  large enough to hold the entire file.
    membuf mb(len+1);
    // use our membuf buffer for our file read-op.
    inf.read(mb.get(), len);
    mb.get()[len] = 0;
    // use iss for your nefarious purposes
    std::istream iss(&mb);
    std::string s;
    while (iss >> s)
        cout << s << endl;
    return EXIT_SUCCESS;
}

你应该研究fgets和scanf,在其中你可以提取匹配的数据片段,这样更容易操作,假设这就是你想要做的

FILE *input = fopen("file.txt", "r");
FILE *output = fopen("out.txt","w");
int bufferSize = 64;
char buffer[bufferSize];
while(fgets(buffer,bufferSize,input) != EOF){
   char data[16];
   sscanf(buffer,"regex",data);
   //manipulate data
   fprintf(output,"%s",data);
}
fclose(output);
fclose(input);

这将是更多的C方法,C++通过使用istream来更雄辩地处理事情:http://www.cplusplus.com/reference/istream/istream/

如果必须这样做,我可能会使用这样的代码:

std::ifstream in("S050508-v3.txt");
std::istringstream buffer;
buffer << in.rdbuf();
std::string data = buffer.str();
if (check_for_good_data(data))
    std::cout << data;

这假设您确实需要一次将输入文件的全部内容存储在内存中,以确定是否应该将其复制到输出中。如果(例如)您可以一次查看一个字节的数据,并在不查看其他字节的情况下确定是否应该复制该字节,那么您可以执行更类似的操作:

std::ifstream in(...);
std::copy_if(std::istreambuf_iterator<char>(in),
             std::istreambuf_iterator<char>(),
             std::ostream_iterator<char>(std::cout, ""),
             is_good_char);

其中CCD_ 1是返回CCD_ 2的函数,该CCD_。

编辑:你处理的文件的大小大多排除了我上面给出的第一种可能性。与一次只处理一行数据相比,读取和写入大块数据几乎肯定会提高速度,这也是正确的。

相关内容

  • 没有找到相关文章

最新更新