计算Windows C中文件的行数

时间:2011-03-13 14:21:41

标签: c

我有这个:

#include "stdafx.h"
#include <windows.h>
#include <assert.h>




int _tmain(int argc, _TCHAR* argv[])
{
    LPCTSTR filePath = argv[1];
    DWORD numLines = _ttoi(argv[2]);

    HANDLE fileHandle = CreateFile(filePath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);


    DWORD fileSize = GetFileSize(fileHandle, NULL);

    TCHAR* file =  (TCHAR*)malloc(fileSize);
    DWORD bytesRead=0;

    ReadFile(fileHandle,file,fileSize,&bytesRead,NULL);

    DWORD numLinesFile = 0;
    for(DWORD i = 0;i<fileSize;i++)
        if(file[i] == '\n')
            numLinesFile++;



    free(file);
    CloseHandle(fileHandle);
    return 0;
}

每次返回0,即使文件实际上是10行。

2 个答案:

答案 0 :(得分:3)

sizeof(file)是指针变量file的大小。您想将Size传递给ReadFile

您可能还希望明确使用char而不是TCHAR - 如果您使用UNICODE进行编译,那么它将无效,您将访问未分配的内存。

答案 1 :(得分:1)

sizeof(file)那部分是错的。你想把Size放在那里。 sizeof(file)为您提供变量file的大小(对应于指针的大小,即4或8个字节),而不是文件本身的大小。

您应该检查ReadFile

的返回值

在代码的第一部分中,您在第二部分使用变量Size变量fileSize。这看起来不对。您当然没有在发布的代码中为fileSize分配正确的大小。请发布完整的编译代码。

此外,您还有char大小问题。如果您的程序编译为unicode,那么TChar将成为一个宽字符(2个字节)。但是你将TChar视为等同于一个字节。

你也不检查你的malloc的结果。如果文件太大,它将是null