c语言 对C程序在windows命令行输出读取并输出

该代码示例展示了如何使用WindowsAPI函数获取控制台的标准输出句柄,读取并处理控制台缓冲区的内容,包括检查和打印非空行。它涉及到内存分配、控制台屏幕缓冲区信息的获取以及字符属性。

由chatgpt生成,彩笔修改并完善ing。

先这样,以后再改

#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
	int y,x;
	printf("dvdsvdsvd\n");
	printf("2592626huby  9498\n");
	printf("  2592626huby  9498\n");
    // 获取标准输出句柄
    HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
    
    // 获取控制台窗口信息
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hStdout, &csbi);

    // 计算控制台窗口缓冲区的大小
    int bufferSize = csbi.dwSize.X * csbi.dwSize.Y;

    // 调整缓冲区的大小
    CHAR_INFO* buffer = (CHAR_INFO*) malloc(bufferSize * sizeof(CHAR_INFO));
    if (buffer == NULL) {
        printf("Error: failed to allocate memory.\n");
        return 1;
    }

    // 读取控制台窗口中的文本
    COORD bufferCoord = {0, 0};
    SMALL_RECT readRegion = {0, 0, csbi.dwSize.X - 1, csbi.dwSize.Y - 1};
    ReadConsoleOutput(hStdout, buffer, csbi.dwSize, bufferCoord, &readRegion);

    // 输出读取到的文本
    for (y = 0; y < csbi.dwSize.Y; y++) {
    int isEmptyLine = 1; // 默认为是空行
    	for (x = 0; x < csbi.dwSize.X; x++) {
        char c = buffer[x + y * csbi.dwSize.X].Char.AsciiChar;
        char* lineStart = &buffer[y * csbi.dwSize.X]; 
      		  if (c != ' ') {
           			 isEmptyLine = 0; // 如果该行有非空字符,说明不是空行
            
       		  }
    	}
		for (x = 0; x < csbi.dwSize.X; x++)   
    	if (!isEmptyLine) { 
		// 只有不是空行才输出换行符
		for (x = 0; x < csbi.dwSize.X; x++){
			char c = buffer[x + y * csbi.dwSize.X].Char.AsciiChar;
			printf("%c",c);
		} 
        printf("\n");
    }
}



    free(buffer);
    return 0;
}

typedef struct _CONSOLE_SCREEN_BUFFER_INFO {
  COORD      dwSize;//COORD 结构,包含控制台屏幕缓冲区的大小(以字符列和行表示)。
  COORD      dwCursorPosition;//包含控制台屏幕缓冲区中光标的列坐标和行坐标。
  WORD       wAttributes;
//由 WriteFile 和 WriteConsole 函数写入屏幕缓冲区或由 ReadFile 和 ReadConsole 函数回显到屏幕缓冲区的字符的属性。
  SMALL_RECT srWindow;//其中包含显示窗口左上角和右下角的控制台屏幕缓冲区坐标。
  COORD      dwMaximumWindowSize;//其中包含控制台窗口的最大大小(以字符列和行表示,给定当前屏幕缓冲区大小和字体以及屏幕大小)。
} CONSOLE_SCREEN_BUFFER_INFO;

typedef struct _COORD {
SHORT X; // horizontal coordinate
SHORT Y; // vertical coordinate
} COORD;

HANDLE是指向内核对象的指针或者句柄。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cllsse

富✌您吉祥

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值