c++ - 使用 C++ 或任何 Windows 脚本语言格式化文本数据

标签 c++ windows file text formatting

这可能是一项简单的任务,但目前我真的不知道如何以简单的方式完成这项工作。 我遇到以下情况,我有一个用 COFFEE 编写的脚本,COFFEE 是 3D 程序 Cinema 4D 的脚本语言。 现在此脚本正在将以下格式的位置数据写入文本文件(在这种情况下为 rtf,但也可以是 .txt)。

0  0.0  471.2  0.0
1  0.0  470.5  0.0
2  0.0  468.8  0.0
3  0.0  465.9  0.0
4  0.0  461.9  0.0
5  0.0  456.8  0.0
6  0.0  450.5  0.0
7  0.0  443.2  0.0
8  0.0  434.8  0.0
9  0.0  425.2  0.0

框架,X,Y,Z。

现在我需要做的是将位置数据转换成这种格式:

Transform   Position
    Frame   X pixels    Y pixels    Z pixels    
    0   0.0    471.2    0.0 
    1   0.0    470.5    0.0 
    2   0.0    468.8    0.0 


End of Keyframe Data

这里不是真的可见,但这里没有空格,所有内容都用制表符隔开(也许将其复制到记事本以真正看到制表符)。重要的是我在每个数字之间都有制表符,可以有空格但我每次都只需要一个制表符。 所以最重要的部分是,我如何从第一个数据集中获取这些数字,并让程序在每个数字之间添加一个\t?

我尝试在脚本中执行此操作,但如果我使用制表符而不是位置之间的多个空格,脚本将失败。 我搜索了很多但找不到任何好的解决方案。 我熟悉 C++ 和一些批处理脚本,但我对每个解决方案都很满意,即使我必须学习另一种语言的基础知识。

我试图在 C++ 中找到一种方法,但我想出的方法无法格式化 n 行,而且每一行都太复杂了。帧数/行数每次都不同,所以我从来没有固定的行数。

最佳答案

这样的事情可能会奏效。我没有对数字进行任何特殊格式设置,因此如果您需要,则需要添加它。如果您担心格式错误的输入文件,例如一行中的数字不够,那么您需要添加一些额外的错误检查以防止出现这种情况。

#include <fstream>
#include <iostream>
#include <vector>

bool Convert(const char* InputFilename, const char* OutputFilename)
{
    std::ifstream InFile(InputFilename);
    if(!InFile)
    {
        std::cout << "Could not open  input file '" << InputFilename << "'" << std::endl;
        return false;
    }

    struct PositionData
    {
        double FrameNum;
        double X;
        double Y;
        double Z;
    };
    typedef std::vector<PositionData> PositionVec;

    PositionVec Positions;
    PositionData Pos;
    while(InFile)
    {
        InFile >> Pos.FrameNum >> Pos.X >> Pos.Y >> Pos.Z;
        Positions.push_back(Pos);
    }

    std::ofstream OutFile(OutputFilename);
    if(!OutFile)
    {
        std::cout << "Could not open output file '" << OutputFilename << "'" << std::endl;
        return false;
    }

    OutFile << "Transform\tPosition\n\tFrame\tX pixels\tY pixels\tZ pixels" << std::endl;
    for(PositionVec::iterator it = Positions.begin(); it != Positions.end(); ++it)
    {
        const PositionData& p(*it);
        OutFile << "\t" << p.FrameNum << "\t" << p.X << "\t" << p.Y << "\t" << p.Z << std::endl;
    }
    OutFile << "End of Keyframe Data" << std::endl;
    return true;
}

int main(int argc, char* argv[])
{
    if(argc < 3)
    {
        std::cout << "Usage: convert <input filename> <output filename>" << std::endl;
        return 0;
    }
    bool Success = Convert(argv[1], argv[2]);

    return Success;
}

关于c++ - 使用 C++ 或任何 Windows 脚本语言格式化文本数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11487878/

相关文章:

c++ - 当一个对象保证比其包含的对象长寿时,应该如何存储该对象?

C++ 最佳键值容器,可按值排序并快速访问删除

c++ - C++文件读取错误

python - 如何在 Windows 和 Linux 上使用相同的 Python virtualenv

windows - 使用 forfiles 将输出重定向到文件

java - 如何存储文件字节并稍后再次创建该文件?

file - 错误: Uncaught Ext.JSON.decode(): You're trying to decode an invalid JSON String

c++ - 如何在 gtk+ 中创建图形

c++ - 如何在 C++ 中读取用 utf-8 编码的 java unicode 字节字符串

windows - Pyspark上saveAsTextFile()中命令字符串异常中的(null)条目