读取以逗号分隔的数字,并将其写入以制表符分隔的文件

Read numbers separated by comma and write them to a file separated by tab

本文关键字:分隔 文件 制表符 数字 读取      更新时间:2023-10-16

给定一个输入文件,例如:

 5,6
 3,4
 4,7

我想将其转换为以下输出,其中数字由制表符分隔:

 5  6
 3  4
 4  7

我有以下代码读取输入文件并尝试写入输出文件:

std::ofstream outputFile("test.txt");
if (outputFile.is_open()) {
    while(std::getline(infile, line, ',')) {
        std::stringstream   linestream(line);
        int val1;
        int val2;
        linestream >> val1 >> val2;
        outputFile << val1 << "t" << val2 << "n";
    }
}

问题是我的输出文件包含:

 1       -1431507824
 3       5
 6       6
 2       6

有人可以解释为什么会发生这种情况吗?

您用逗号分隔,因此在第一次调用中只读取一个值。一种可能的解决方法是将一行读取到换行符,然后在两个值之间的逗号中显式读取:

while(std::getline(infile, line)) {
    std::stringstream   linestream(line);
    int val1;
    int val2;
    char comma;
    linestream >> val1 >> comma >> val2;
    outputFile << val1 << "t" << val2 << "n";
}

std::getline(linestream, data, ',');

您读取了流中的第一个逗号的所有内容。这些数据将由您丢弃。

然后当你这样做时

linestream >> val1 >> val2;

您将剩余的值读入 val1 ,然后提取将在 val2 内失败,因为没有更多要读取的内容。这将导致val2未初始化并具有不确定的值。

一个简单的解决方案是简单地将字符串转换为data(使用 std::stoi (并分配给val1(因为这是它包含的值(,然后将剩余的值读取到 val2 中。类似的东西

std::getline(linestream, data, ',');
val1 = std::stoi(data);
linestream >> val2;

通过您的编辑,上述答案仅部分有效。不过,解决方案基本相同。

因为您添加了","作为显式分隔字符。

在这里你想要什么

int main(){
        std::ofstream outputFile("test.txt");
        std::istringstream input;
        input.str("5,6n3,4n4,7n");
        string line;
        stringstream linestream;
            while(getline(input, line)) {
                std::stringstream   linestream(line);
                int val1;
                int val2;
                char comma;         
                linestream >> val1>> comma >> val2;
                outputFile << val1 << "t" << val2 << "n";
        }
}

输出:

5   6
3   4
4   7