C语言中如何定位文件txt的光标

C语言中如何定位文件txt的光标,第1张

1、使用fseek函数即可更改文件指针的位置。

函数名: fseek
功 能: 重定位流上的文件指针
用 法: int fseek(FILE stream, long offset, int fromwhere);
描 述: 函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere为基准,偏移offset个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
返回值: 成功,返回0,否则返回其他值。

2、例子:

fseek(fp,100L,0);//把文件内部指针移动到离文件开头100字节处;
fseek(fp,100L,1);//把文件内部指针移动到离文件当前位置100字节处;
fseek(fp,-100L,2);//把文件内部指针退回到离文件结尾100字节处。

用SendInput函数。第二个参数是一个INPUT结构体的数组,第一个参数代表这个数组有几个元素,最后一个参数代表这个数组中每一个元素是几个字节。#include#pragmacomment(lib,"user32lib")intmain(){INPUTmouseInput;ZeroMemory(&mouseInput,sizeofmouseInput);mouseInputtype=INPUT_MOUSE;mouseInputmidx=10;mouseInputmidy=10;mouseInputmidwFlags=MOUSEEVENTF_MOVE;SendInput(1,&mouseInput,sizeof(mouseInput));return0;}以上代码把鼠标往右移动10往下移动10。使用MOUSEEVENTF_ABSOLUTE这个flag可以指定绝对位置,它把屏幕右下角定义为65535,65535把左上角定义为0,0所以#includeintmain(){INPUTmouseInput;ZeroMemory(&mouseInput,sizeofmouseInput);mouseInputtype=INPUT_MOUSE;mouseInputmidx=32767;mouseInputmidy=32767;mouseInputmidwFlags=MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE;SendInput(1,&mouseInput,sizeof(mouseInput));return0;}是移动到屏幕正中央。至于鼠标点击:#includeintmain(){INPUTmouseInput;ZeroMemory(&mouseInput,sizeofmouseInput);mouseInputtype=INPUT_MOUSE;mouseInputmidwFlags=MOUSEEVENTF_LEFTDOWN;SendInput(1,&mouseInput,sizeof(mouseInput));mouseInputmidwFlags=MOUSEEVENTF_LEFTUP;SendInput(1,&mouseInput,sizeof(mouseInput));return0;}就是“按下”再“d起来”。双击就是来两次,右击就是LEFT改成RIGHT。

我之前给别人写过一个打地鼠的小游戏,就是用鼠标 *** 作的。发给你参考下。代码很简单。

主要函数我在下方说明了,但更多信息你必须自己百度看,一言两语说不完。

SetConsoleCursorPosition函数可以定位光标位置,也就是文字内容显示的起点。

ReadConsoleInput(HANDLE hConsoleInput,INPUT_RECORD lpBuffer,DWORD nLength,
DWORD lpNumberOfEventsRead)函数可以获取鼠标的 *** 作信息。

调用过上面函数后,lpBuffer由于是传址,所以其地址里的值就包含了鼠标信息。

lpBufferEventType == MOUSE_EVENT //判断是鼠标事件

lpBufferEventMouseEventdwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED//判断是鼠标左键点击

两个判断一起就是鼠标左键点击的判断,其他事件参数你可以自己网上找。

#include <stdioh>
#include <stdlibh>
#include <windowsh>
#include <conioh>
#include <timeh>
#include <stringh>
#include <malloch>
#define gSizek 30//区域大小宽度
#define gSizeg 20//区域大小高度
#define gBegin 3//活动区域起始行
int main()
{
    int t=0,s0,s1,i,j,count=0,fen=0,row=0,clo=0;
    char gameA[gSizeg][gSizek+1],fSave[10]={0};
    SetConsoleTitle("打地鼠");
    HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄
    INPUT_RECORD inRec;
    DWORD res;
    COORD p0;
    p0X=0;
    p0Y=0;
    srand(time(0));
    s0= time(NULL);
    strcpy(gameA[0],"            GAME");
    strcpy(gameA[1],"未命中次数:0,计分:000000");
    for(i=gBegin-1;i<gSizeg;i++)
    {
        for(j=0;j<gSizek+1;j++)
        {
            if(i>gBegin-1 && i<gSizeg-1 && j>0 && j<gSizek-1)
                gameA[i][j]=' ';
            else
                gameA[i][j]=4;
            if(j==gSizek)
                gameA[i][j]=0;
        }
    }
    for(i=0;i<gSizeg;i++)
        printf("%s\n",gameA[i]);
    while (1)
    {
        if(t>=3)
        {
            if(row>0 && clo>0)
                gameA[row][clo]=' ';
            row=rand()%(gSizeg-1);
            clo=rand()%(gSizek-1);
            s0= time(NULL);
            SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p0);
            if(row<3)
                row=4;
            if(clo<1)
                clo=1;
            gameA[row][clo]=2;
            for(i=0;i<gSizeg;i++)
            {
                //gameA[i][gSizeg+1]=0;
                printf("%s\n",gameA[i]);
            }
        }
        if(count==3)
        {
            p0X=10;
            p0Y=8;
            SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p0);
            printf("GAME OVER!");
            break;
        }
        s1= time(NULL);
        t=s1-s0;
        ReadConsoleInput(hInput, &inRec, 1, &res);
        if (inRecEventType == MOUSE_EVENT && inRecEventMouseEventdwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) //鼠标左键
        {
            if(inRecEventMouseEventdwMousePositionX==clo && inRecEventMouseEventdwMousePositionY==row)
            {
                if(fen==0)
                    fen=1;
                if(fen>999999)
                    fen=999999;
                else
                    fen=fen2;
                sprintf(fSave,"%06d",fen);
                gameA[1][18]=0;
                strcat(gameA[1],fSave);
            }
            else
            {
                count++;
                fen=0;
                gameA[1][11]=count+'0';
            }
            t=4;
        }
    }
    while(1);
    return 0;
}

可以,需要调用windowsAPI函数。
头文件windowsh。
简单思路:
通过GetStdHandle获取标准输入句柄。
再通过ReadConsokeInput将输入信息存储到结构体类型INPUT_RECODE变量中。
再通过判断,截取到鼠标电击的事件。
具体API函数、参数、功能还有很多。需要网上找资料可以学。
我这里就简单写一个,鼠标点击控制台任意位置,并在该位置打印字符串。

#include <stdioh>
#include <windowsh>
int main()
{
    HANDLE hInput = GetStdHandle(STD_INPUT_HANDLE); // 获取标准输入设备句柄
    INPUT_RECORD inRec;
    DWORD res;
    COORD p0;
    while(1)
    {
        ReadConsoleInput(hInput, &inRec, 1, &res);
        if (inRecEventType == MOUSE_EVENT && inRecEventMouseEventdwButtonState == FROM_LEFT_1ST_BUTTON_PRESSED) //鼠标左键
        {
            p0X=inRecEventMouseEventdwMousePositionX;
            p0Y=inRecEventMouseEventdwMousePositionY;
            SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),p0);
            printf("你在这里点击的左键\n");
        }
    }
    return 0;
}

turboc的
#include <stdioh>
#include <conioh>
int main()
{
int x, y;
gotoxy(5, 5);
printf("position: 5, 5");
x = wherex();
y = wherey();
getch();
gotoxy(x, y - 1);
getch();
}
控制台的
#include <windowsh>
#include <stdioh>
#include <conioh>
void gotoxy(HANDLE hOut, int x, int y);
void getxy(HANDLE hOut, int &x, int &y);
int main()
{
int x, y;
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
gotoxy(hOut, 5, 5);
printf("position: 5, 5");
getxy(hOut, x, y);
getch();
gotoxy(hOut, x, y - 1);
getch();
CloseHandle(hOut);
}
void gotoxy(HANDLE hOut, int x, int y)
{
COORD pos;
posX = x;
posY = y;
SetConsoleCursorPosition(hOut, pos);
}
void getxy(HANDLE hOut, int &x, int &y)
{
CONSOLE_SCREEN_BUFFER_INFO screen_buffer_info;
GetConsoleScreenBufferInfo(hOut, &screen_buffer_info);
x = screen_buffer_infodwCursorPositionX;
y = screen_buffer_infodwCursorPositionY;
}

楼主您好,你这个分值已经吸引了我
在下不才,也是自己写过一些c语言画图模式下的程序。所以我认为我在这一方面具有一定的权威
(文本模式下)
我对于您的问题理解的不是很透彻,但是看字面意思来说,您是想当前坐标赋值给变量,我假设变量为(x、y)分别为x轴、y轴坐标变量。则将坐标赋值,为x=getx();y=gety();
(画图模式下)
在这里,我一般是直接对寄存器进行中断取得 鼠标 的值。在对他进行 *** 作。
c语言只有以上2种模式,通过你的提问,我觉得你问的是文本模式下的。如果你觉得我回答不够详细,可以直接加QQ:942690451 询问。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/10354308.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-07
下一篇2023-05-07

发表评论

登录后才能评论

评论列表(0条)

    保存