簡體   English   中英

ReadFile Win32 API

[英]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);

另外,重命名hinhout

其他人已經回答了你的問題。 這是關於代碼的。

// 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>之前定義了STRICTNOMINMAX 使用現代工具,默認情況下至少定義了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM