繁体   English   中英

C++ 简单文件 I/O 问题

[英]C++ Simple File I/O Issue

我有这段代码读取 CSV .txt 文件,如下所示(实际文件有数百万行长):

1,2,3,4,5,
6,7,8,9,10,
11,12,13,14,15,
16,17,18,19,20,
etc...

代码的目的应该是将导入的文本文件的每一列分隔成一个单独的文件。 例如,对于上面的示例数据,文本文件 1 将是

1
6
11
16

文本文件 2 将是

2
7
12
17

等等...

现在我正在为两件事而苦苦挣扎。

  1. 由于某种原因,代码跳过第一个值并两次读取最后一个值。
  2. 我无法想出一种方法来一次读取所有 5 列并将它们自动放入单独的文本文件中。 当我尝试这样做之前,它会跳过每列的所有其他值。

我将 while 循环中的每个“out_file”语句都注释掉了,这样我就可以一个一个地手动执行它,这将解决跳过所有其他值的问题,但是在一个一个地执行列时仍然存在第一个和最后一个值问题。

这是我的代码:

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

using namespace std;

int main(int argc, char *argv[]) {
string line1;
string value1;
string value2;
string value3;
string value4;
string value5;

ifstream in_file ("in_file_comma_appended.txt");
    
ofstream out_file;

out_file.open("out_file.txt");

if (in_file.is_open())
{
    while (getline(in_file,line1))
    {
        getline(in_file, value1, ',');
        out_file << value1 << "\n";

        getline(in_file, value2, ',');
        //out_file << value2 << "\n";

        getline(in_file, value3, ',');
        //out_file << value3 << "\n";
        
        getline(in_file, value4, ',');
        //out_file << value4 << "\n";
        
        getline(in_file, value5, ','); 
        //out_file << value5 << "\n";
    }
    in_file.close();
    out_file.close();
}
    return 0;
}

请让我知道如何解决这些问题。

您的循环正在从文件中读取整行,但对该行没有做任何事情,它只是被扔掉了。 在循环内部,您然后从输入文件中读取接下来的 5 个单独的值并将它们写入输出文件。 但是在下一次循环迭代中,您再次读取下整行并将其丢弃。 等等。 这就是您跳过值的原因。

在循环内,使用std::istringstream从循环条件已读取的行字符串中读出值,例如:

#include <iostream>
#include <string>
#include <fstream>
#include <sstream>

using namespace std;

int main(int argc, char *argv[])
{
    ifstream in_file ("in_file_comma_appended.txt");
    if (in_file.is_open())
    {
        ofstream out_files[5];
        for (int i = 0; i < 5; ++i) {
            out_files[i].open ("out_file_" + to_string(i+1) + ".txt");
        }

        string line, value;

        while (getline(in_file, line))
        {
            istringstream iss(line);

            for(int i = 0; i < 5; ++i)
            {
                getline(iss, value, ',');
                out_files[i] << value << "\n";
            }
        }
    }

    return 0;
}

我想不出一次阅读所有 5 列的方法
...并自动将它们放入单独的文本文件中。

考虑对中间值使用字符串流。 如果您愿意,可以同时运行它们……这些是基于 ram 的。

stringstream ss1;
stringstream ss2;
stringstream ss3;
stringstream ss4;
stringstream ss5;


while (getline(in_file,line1))
{
    getline(in_file, value1, ',');
    ss1 << value1 << "\n";

    getline(in_file, value2, ',');
    ss2 << value2 << "\n";

    getline(in_file, value3, ',');
    ss3 << value3 << "\n";
    
    getline(in_file, value4, ',');
    ss4 << value4 << "\n";
    
    getline(in_file, value5, ','); 
    ss5 << value5 << "\n";
}

// open column 1 file
outfile1 << ss1.str(); // write col 1 data
// close column 1 file

// open column 2 file
outfile2 << ss2.str(); // write col 2 data
// close column 2 file

... Repeat this open-write-and-close 
...    for each of the other column files.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM