0

我正在处理一个使用这样的管道输出文本的文件:

 > main.exe | set-content image.ppm -encoding String

问题是我希望有一个进度条,而不会将它通过管道传输到文本文件中。 Console.Error.Write()似乎这样做,但是我不能让倒计时发生在适当的位置,而不是一堆连续发生的字符串。我尝试过Console.SetCursorPosition()几种不同的使用方式,但也许我使用不当。

这是它如何与 C++ 一起工作,我正在尝试用 C# 编写它:

std::cout << "P3\n" << image_width << ' ' << image_height << "\n255\n";

for (int j = image_height - 1; j >= 0; --j) {
    
    //progress bar
    std::cerr << "\rScanlines remaining: " << j << ' ' << std::flush;
    
    //output to ppm file
    for (int i = 0; i < image_height; ++i) {
        auto r = double(i) / (image_width - 1);
        auto g = double(j) / (image_height - 1);
        auto b = 0.25;

        int ir = static_cast<int>(255.999 * r);
        int ig = static_cast<int>(255.999 * g);
        int ib = static_cast<int>(255.999 * b);

        std::cout << ir << ' ' << ig << ' ' << ib << '\n';
    }

C#(无法让进度条正常工作)

    Console.WriteLine("P3");
    Console.WriteLine($"{image_width} {image_height}");
    Console.WriteLine(255);

    for (int j = image_height - 1; j >= 0; j--)
    {
        
        //progress bar
        //Console.SetCursorPosition(0, Console.CursorLeft);
        //Console.SetCursorPosition(left, top);
        Console.Error.Write($"Scanlines Remaining: {j}");
        
        //output to ppm file
        for (int i = 0; i < image_height; i++)
        {
            var r = (double)i / (image_width - 1);
            var g = (double)j / (image_height - 1);
            var b = 0.25;

            int ir = (int)(255.999 * r);
            int ig = (int)(255.999 * g);
            int ib = (int)(255.999 * b);

            Console.WriteLine($"{ir} {ig} {ib}");
        }
    }

我希望进度条能够顺利显示倒计时,而不是这样: 倒数

4

0 回答 0