VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 96|回复: 4

[已解决]setfilepointer不能用负数

[复制链接]
72_avatar_middle
最佳答案
0 
在线会员 发表于 2020-4-16 11:40:56 | 显示全部楼层 |阅读模式
setfilepointer 和setfilepointerex的读取字节的参数不能使用负整数吗,不知道这是什么错误,跪求
错误如图,所有代码贴在下面

#include<windows.h>
#include<tchar.h>

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPTSTR lpCmdLine, int nShowCmd)
{
    HANDLE hfile = CreateFile(_T("E:\\VS2019\\项目程序\\Windows编程\\文件操作\\SetFilePointerEx\\1.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hfile == INVALID_HANDLE_VALUE)
    {
        MessageBox(NULL, _T("文件打开失败"), _T("tip"), MB_OK);
        return -1;
    }
   
    DWORD dwfilesize = GetFileSize(hfile,NULL);

    LARGE_INTEGER ldistance = { 0 };
    ldistance.QuadPart = dwfilesize;
    SetFilePointerEx(hfile, ldistance, NULL, FILE_BEGIN);

    int num = 123;
    DWORD dwrealwrite = 0;
    BOOL bret = WriteFile(hfile, &num, sizeof(num), &dwrealwrite, NULL);
    if (bret)
        MessageBox(NULL, _T("写入成功"), _T("tip"), MB_OK);
    else
                MessageBox(NULL, _T("写入失败"), _T("tip"), MB_OK);
    CloseHandle(hfile);


    hfile = CreateFile(_T("E:\\VS2019\\项目程序\\Windows编程\\文件操作\\SetFilePointerEx\\1.txt"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (hfile == INVALID_HANDLE_VALUE)
        {
                MessageBox(NULL, _T("文件打开失败"), _T("tip"), MB_OK);
                return -1;
        }

    int ret_num = 0;
    DWORD dwrealread = 0;

    LARGE_INTEGER ldistance2 = { 0 };
    int movesize = sizeof(int) * -1;
    ldistance2.QuadPart = movesize;
    SetFilePointerEx(hfile, ldistance2, NULL, FILE_END);
        bret = WriteFile(hfile, &ret_num, sizeof(ret_num), &dwrealread, NULL);
        if (bret)
                MessageBox(NULL, _T("读取成功"), _T("tip"), MB_OK);
        else
                MessageBox(NULL, _T("读取失败"), _T("tip"), MB_OK);
        CloseHandle(hfile);
    return 0;
}
最佳答案
57_avatar_small
2020-4-16 17:24:32
JLDawson 发表于 2020-4-16 14:02
这里牵扯到两个内容:
①sizeof的返回值类型为无符号整型十进制数。一个负整型常数转换为无符号类型,从而 ...

补充:
C4308错误:负整型常量转换为无符号类型
一个负整型常数转换为无符号类型,从而导致一个可能无意义结果。
此处报错因为将 负整型常量-1隐式转换unsigned int类型。
触发隐式转换的原因为sizeof的返回值类型为无符号整型, 无符号整型和负整型常量相乘会触发隐式转换。
QQ截图20732.jpg




上一篇:关于虚函数和多态性的问题
下一篇:要让文件夹以详细信息显示怎么写代码
57_avatar_middle
最佳答案
19 
在线会员 发表于 2020-4-16 14:02:56 | 显示全部楼层
这里牵扯到两个内容:
①sizeof的返回值类型为无符号整型十进制数。一个负整型常数转换为无符号类型,从而导致一个可能无意义结果。
②隐式转换,可查看网址内的资料:https://blog.csdn.net/yusiguyuan/article/details/41643819
51_avatar_middle
最佳答案
74 
online_admins 发表于 2020-4-16 16:34:46 | 显示全部楼层
SetFilePointer 的第二个参数 lDistanceToMove 是可以为负数的,负数就表明往前挪,正数表示往后挪,MSDN上也说了:
https://docs.microsoft.com/en-us ... eapi-setfilepointer
57_avatar_middle
最佳答案
19 
在线会员 发表于 2020-4-16 17:24:32 | 显示全部楼层    本楼为最佳答案   
bestAnswer
JLDawson 发表于 2020-4-16 14:02
这里牵扯到两个内容:
①sizeof的返回值类型为无符号整型十进制数。一个负整型常数转换为无符号类型,从而 ...

补充:
C4308错误:负整型常量转换为无符号类型
一个负整型常数转换为无符号类型,从而导致一个可能无意义结果。
此处报错因为将 负整型常量-1隐式转换unsigned int类型。
触发隐式转换的原因为sizeof的返回值类型为无符号整型, 无符号整型和负整型常量相乘会触发隐式转换。
72_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-4-17 10:51:27 | 显示全部楼层
JLDawson 发表于 2020-4-16 17:24
补充:
C4308错误:负整型常量转换为无符号类型
一个负整型常数转换为无符号类型,从而导致一个可能无 ...

对对对在写sizeof(int)时改成static_cast<int>(sizeof(int))  之后再乘-1就对了
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-6-2 02:26

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表