我想读一个文件..但..当我调试我的程序它运行但弹出窗口说系统编程已经停止工作,并在控制台,它写道,按Enter键关闭程序.我的代码是::
// System Programming.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "iostream"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hin;
HANDLE hout;
TCHAR buff[20]= {'q','2','3'};
TCHAR buff2[20]={'a','v'};
hin = CreateFile(_T("Abid.txt"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hin == INVALID_HANDLE_VALUE)
{
cout<<"error";
}
WriteFile(hin,buff,40,0,NULL);
CloseHandle(hin);
hout = CreateFile(_T("Abid.txt"),GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hout == INVALID_HANDLE_VALUE)
{
cout<<"error";
}
ReadFile(hout,buff2,40,0,NULL);
CloseHandle(hout);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Aby*_*byx 12
根据MSDN,只有当lpOverlapped参数不为NULL时,lpNumberOfBytesWritten参数才能为NULL.所以电话应该是
DWORD nWritten;
WriteFile(hin, buff, 40, &nWritten, NULL);
Run Code Online (Sandbox Code Playgroud)
和
DWORD nRead;
ReadFile(hout, buff2, 40, &nRead, NULL);
Run Code Online (Sandbox Code Playgroud)
另外,重命名hin和hout.
其他人已经回答了你的问题.这是关于代码的.
// Your code:
// System Programming.cpp : Defines the entry point for the console application.
//
Run Code Online (Sandbox Code Playgroud)
只需删除该评论即可.事实并非如此.:-) 您的程序的入口点是机器代码开始执行的地方,并且使用Microsoft工具链由/entry链接器选项指定.
请注意,Microsoft的文档通常会对入口点感到困惑,例如,它始终以某种方式记录入口点的错误签名.
它是最臭名昭着的Microsoft文档错误之一,并且,鉴于它以各种形式持续存在了15年,我认为它说了些什么(不确定到底是什么).
// Your code:
#include "stdafx.h"
Run Code Online (Sandbox Code Playgroud)
您不需要此自动生成的标头.而是使用<windows.h>.包含<windows.h>在您的程序中的最小方法是
#undef UNICODE
#define UNICODE
#include <windows.h>
Run Code Online (Sandbox Code Playgroud)
对于C++,您通常还要确保在包含之前定义STRICT并NOMINMAX定义<windows.h>.使用现代工具至少STRICT是默认定义的,但确保没有坏处.没有它,一些声明将无法使用C++编译器进行编译,至少在没有重新解释强制转换的情况下,例如对话程序.
// Your code:
#include "iostream"
using namespace std;
Run Code Online (Sandbox Code Playgroud)
差不多好的.
做这个:
#include <iostream>
using namespace std;
Run Code Online (Sandbox Code Playgroud)
不同之处在于编译器搜索标头的位置.使用引用的名称,它首先在一些其他位置搜索(这就是标准所说的所有内容).对于大多数编译器,这些附加位置包括包含文件的目录.
// Your code:
int _tmain(int argc, _TCHAR* argv[])
Run Code Online (Sandbox Code Playgroud)
不好了!不要这样做.它是Microsoft"功能",有助于支持Windows 9.x. 只有在您使用动态链接的MFC并且您的目标是Windows 9.x时,它才有意义; 在图片中没有MFC,您只需使用Microsoft Unicode层.
您使用动态链接的MFC使用应用程序真正定位Windows 9.x的区域?
相反,做......
int main()
Run Code Online (Sandbox Code Playgroud)
...这是标准的,或使用Microsoft语言扩展...
int wMain( int argc, wchar_t* argv[] )
Run Code Online (Sandbox Code Playgroud)
...如果你想以"简单"的方式处理命令行参数.
// Your code:
{
HANDLE hin;
HANDLE hout;
TCHAR buff[20]= {'q','2','3'};
TCHAR buff2[20]={'a','v'};
Run Code Online (Sandbox Code Playgroud)
这些TCHAR东西只是Windows 9.x中MFC的支持.
除了完全没必要之外(可能是你真的没有针对Windows 9.x,是吗?),它隐藏了你的意图并伤害了眼睛.
你的意思是 ...
char buff[20] = {'q', '2', '3'};
Run Code Online (Sandbox Code Playgroud)
... 也许?
// Your code:
hin = CreateFile(_T("Abid.txt"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hin == INVALID_HANDLE_VALUE)
{
cout<<"error";
}
Run Code Online (Sandbox Code Playgroud)
正如其他人所提到的,OPEN_EXISTING在创建文件时不合逻辑,并且计数指针参数不能为0.
使用时<windows.h>,UNICODE如果应该定义,则应将filename参数指定为L"Abid.txt".
干杯&hth.,
| 归档时间: |
|
| 查看次数: |
26036 次 |
| 最近记录: |