You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS2022环境下C++代码无法输出PPM/TXT文件的原因排查求助

解决VS2022中C++代码无法生成PPM/TXT输出文件的问题

问题描述

我在Visual Studio 2022环境中运行以下C++代码,使用IrfanView 64作为PPM格式图像查看器。代码原本目标是输出带有两个左上角矩形的白色背景PPM图像,但当前无法输出任何类型的文件(含TXT或PPM)。代码无可见错误且能正常运行,但完全无输出。我怀疑问题出在文件写入模块,但尚未确认,尝试移除结构体重写仍无效。

原代码

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

using namespace std;

const int WIDTH = 300;
const int HEIGHT = 200;

struct Pixel {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
};

/*
A function that will write the specified data for the
shapes in the image to the specified file

@param image - the array that will be written to by this function
@param height - the height of the image
@param fileName - the name of the file that will utilize the array

@return bool - true if the file opens, false if the file fails to open
*/
bool writeImage(Pixel image[][WIDTH], int height, const string fileName) {

    ofstream imageFile;

    imageFile.open(fileName);

    if (!imageFile) // checks if the file successfully opened
    {
        cout << "The file failed to open, please try again.";
        return false;
    }

    imageFile << "P3" << '\n';  //Header information
    imageFile << WIDTH << ' ' << HEIGHT << '\n';
    imageFile << 255 << '\n';

    for (int row = 0; row < height; row++) {
        for (int col = 0; col < WIDTH; col++) {
            imageFile << 255 << ' ' << 255 << ' ' << 255 << ' ';
        }
        imageFile << '\n';
    }

    imageFile.close();
    return true;
}


/*
A function that draws a rectangle by outputting integers lining up
with pixel values

@param image - the array that will be modified for the rectangle
@param imgHeight - height of the entire image
@param rectTop - the top of the rectangle's distance from the top of the whole image
@param rectLeft - the left side of the rectangle's distance from the left side of the whole image
@param rectHeight - the height of the rectangle itself (not in comparison to the image)
@param rectWidth - the width of the rectangle (not in comparison to the image)
@param red - the red amount
@param green - the green amount
@param blue - the blue amount
*/
void drawRect(Pixel image[][WIDTH], int imgHeight,
    int rectTop, int rectLeft, int rectHeight, int rectWidth, unsigned char red, unsigned char green, unsigned char blue) {

    Pixel rect;

    rect.red = red;
    rect.green = green;
    rect.blue = blue;

    for (int row = rectTop; row < rectHeight + rectTop; row++)
        for (int col = rectLeft; col < rectWidth + rectLeft; col++)
            image[row][col] = { rect.red, rect.green, rect.blue };

}

/*
A function that creates all of the image's pixel values

@param image - the array that will be modified
@param height - the height of the image
*/
void createImage(Pixel image[][WIDTH], int height) {
    for (int row = 0; row < height; row++) {
        for (int col = 0; col < WIDTH; col++)
            image[row][col] = { 255, 255, 255 };
    }

    drawRect(image, HEIGHT, 6, 8, 10, 20, 150, 200, 130);
    drawRect(image, HEIGHT, 10, 30, 20, 30, 1, 40, 100);
}

int main()
{
    static Pixel image[HEIGHT][WIDTH];

    createImage(image, HEIGHT);
    writeImage(image, HEIGHT, "Test.txt");


    return 1;
}

解决方案

1. 确认文件输出路径

VS默认将输出文件生成在项目的Debug/Release子目录,而非代码所在目录。可以通过两种方式验证:

  • 使用绝对路径测试,比如将writeImage的文件名参数改为"C:\\Test.ppm"
  • 右键项目→属性→调试→工作目录,设置为代码文件所在的目录

2. 修复writeImage函数的核心逻辑

当前函数完全忽略了传入的image数组,直接输出全白像素,导致矩形无法被写入。同时需要将unsigned char类型的像素值转换为int输出,避免输出字符而非数值:

for (int row = 0; row < height; row++) {
    for (int col = 0; col < WIDTH; col++) {
        imageFile << static_cast<int>(image[row][col].red) << ' ' 
                  << static_cast<int>(image[row][col].green) << ' ' 
                  << static_cast<int>(image[row][col].blue) << ' ';
    }
    imageFile << '\n';
}

3. 查看文件打开失败的提示

如果文件打开失败,代码会输出提示,但控制台窗口可能一闪而过。可以在main函数末尾添加system("pause");,或者按Ctrl+F5运行程序,让窗口保持打开状态,查看是否有错误信息。

4. 使用正确的文件后缀

将输出文件名改为"Test.ppm",方便IrfanView直接识别并打开PPM格式图像。

修改后的完整代码

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

using namespace std;

const int WIDTH = 300;
const int HEIGHT = 200;

struct Pixel {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
};

bool writeImage(Pixel image[][WIDTH], int height, const string fileName) {
    ofstream imageFile;
    imageFile.open(fileName);

    if (!imageFile) {
        cout << "The file failed to open, please try again.";
        return false;
    }

    imageFile << "P3" << '\n';
    imageFile << WIDTH << ' ' << HEIGHT << '\n';
    imageFile << 255 << '\n';

    for (int row = 0; row < height; row++) {
        for (int col = 0; col < WIDTH; col++) {
            imageFile << static_cast<int>(image[row][col].red) << ' ' 
                      << static_cast<int>(image[row][col].green) << ' ' 
                      << static_cast<int>(image[row][col].blue) << ' ';
        }
        imageFile << '\n';
    }

    imageFile.close();
    return true;
}

void drawRect(Pixel image[][WIDTH], int imgHeight,
    int rectTop, int rectLeft, int rectHeight, int rectWidth, unsigned char red, unsigned char green, unsigned char blue) {
    for (int row = rectTop; row < rectHeight + rectTop; row++)
        for (int col = rectLeft; col < rectWidth + rectLeft; col++)
            image[row][col] = { red, green, blue };
}

void createImage(Pixel image[][WIDTH], int height) {
    for (int row = 0; row < height; row++) {
        for (int col = 0; col < WIDTH; col++)
            image[row][col] = { 255, 255, 255 };
    }

    drawRect(image, HEIGHT, 6, 8, 10, 20, 150, 200, 130);
    drawRect(image, HEIGHT, 10, 30, 20, 30, 1, 40, 100);
}

int main()
{
    static Pixel image[HEIGHT][WIDTH];

    createImage(image, HEIGHT);
    // 可替换为绝对路径测试
    writeImage(image, HEIGHT, "Test.ppm");

    system("pause");
    return 0;
}

内容的提问来源于stack exchange,提问作者HopefulWit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:42:33