[英]ReadFile Win32 API
我想讀一個文件..但..當我調試我的程序它運行但彈出窗口說系統編程已經停止工作,並在控制台,它寫道,按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;
}
根據MSDN,只有當lpOverlapped參數不為NULL時,lpNumberOfBytesWritten參數才能為NULL。 所以電話應該是
DWORD nWritten;
WriteFile(hin, buff, 40, &nWritten, NULL);
和
DWORD nRead;
ReadFile(hout, buff2, 40, &nRead, NULL);
另外,重命名hin和hout 。
其他人已經回答了你的問題。 這是關於代碼的。
// Your code:
// System Programming.cpp : Defines the entry point for the console application.
//
只需刪除該評論即可。 事實並非如此。 :-)程序的入口點是機器代碼開始執行的地方,使用Microsoft工具鏈由/entry
鏈接器選項指定。
請注意,Microsoft的文檔通常會對入口點感到困惑,例如,它始終以某種方式記錄入口點的錯誤簽名。
它是最臭名昭着的Microsoft文檔錯誤之一,並且,鑒於它以各種形式持續存在了15年,我認為它說了些什么(不確定到底是什么)。
// Your code:
#include "stdafx.h"
您不需要此自動生成的標頭。 而是使用<windows.h>
。 為您的程序包含<windows.h>
最小方法是
#undef UNICODE
#define UNICODE
#include <windows.h>
對於C ++,您通常還要確保在包含<windows.h>
之前定義了STRICT
和NOMINMAX
。 使用現代工具,默認情況下至少定義了STRICT
,但確保它並沒有什么壞處。 沒有它,一些聲明將無法使用C ++編譯器進行編譯,至少在沒有重新解釋強制轉換的情況下,例如對話程序。
// Your code:
#include "iostream"
using namespace std;
差不多好的。
做這個:
#include <iostream>
using namespace std;
不同之處在於編譯器搜索標頭的位置。 使用引用的名稱,它首先在一些其他位置搜索(這就是標准所說的所有內容)。 對於大多數編譯器,這些附加位置包括包含文件的目錄。
// Your code:
int _tmain(int argc, _TCHAR* argv[])
不好了! 不要這樣做。 它是Microsoft“功能”,有助於支持Windows 9.x. 只有在您使用動態鏈接的MFC並且您的目標是Windows 9.x時,它才有意義; 在圖片中沒有MFC,您只需使用Microsoft Unicode層。
您使用動態鏈接的MFC使用應用程序真正定位Windows 9.x的區域?
相反,做......
int main()
...這是標准的,或使用Microsoft語言擴展...
int wMain( int argc, wchar_t* argv[] )
...如果你想以“簡單”的方式處理命令行參數。
// Your code:
{
HANDLE hin;
HANDLE hout;
TCHAR buff[20]= {'q','2','3'};
TCHAR buff2[20]={'a','v'};
TCHAR
東西只是Windows 9.x中MFC的支持。
除了完全沒必要之外(可能是你真的沒有針對Windows 9.x,是嗎?),它隱藏了你的意圖並傷害了眼睛。
你的意思是 ...
char buff[20] = {'q', '2', '3'};
... 也許?
// Your code:
hin = CreateFile(_T("Abid.txt"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
if(hin == INVALID_HANDLE_VALUE)
{
cout<<"error";
}
正如其他人所提到的,當您創建文件時, OPEN_EXISTING
不合邏輯,並且計數指針參數不能為0。
使用<windows.h>
,如果定義了UNICODE
,則應將filename參數指定為L"Abid.txt"
。
干杯&hth。,
問題是您正在為lpNumberOfBytesWritten
/ lpNumberOfBytesread
參數傳遞NULL指針。 雖然這是一個可選參數,但有一個條件:
僅當lpOverlapped參數不為NULL時,此參數才可以為NULL
此外,您可能錯誤地調整了緩沖區的大小:
WriteFile(hin,buff,40,0,NULL); // says that buff has 40 bytes
ReadFile(hout,buff2,40,0,NULL); // says that buff2 has 40 bytes
但是如果你正在編譯ANSI而不是UNICODE,那么它們的大小只有20個字節。
您應該使用sizeof(buff)
和sizeof(buff2)
代替。
假設您的初始代碼嘗試將文件創建為新文件,那么您不能使用OPEN_EXISTING
,您必須在此調用中使用OPEN_ALWAYS
(或其他一些創建變體)。
用於回讀的OPEN_EXISTING
用法將正常。
順便說一下,一旦修復了WriteFile
調用就會導致訪問沖突,因為你試圖寫入數組包含的更多字節。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.