计算windows C中文件的行数

计算windows C中文件的行数,c,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,F

我有这个:

#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;
}
#包括“stdafx.h”
#包括
#包括
int _tmain(int argc,_TCHAR*argv[]
{
LPCTSTR filePath=argv[1];
德沃德·努姆林斯=_ttoi(argv[2]);
HANDLE fileHandle=CreateFile(文件路径、通用读取、文件共享读取、NULL、打开现有、文件标志、顺序扫描、NULL);
DWORD fileSize=GetFileSize(fileHandle,NULL);
TCHAR*file=(TCHAR*)malloc(fileSize);
DWORD字节读=0;
ReadFile(fileHandle、file、fileSize和bytesRead,NULL);
DWORD numLinesFile=0;
for(DWORD i=0;i
sizeof(file)
是指针变量
file
的大小。要将
size
传递到
ReadFile

您可能还想显式地使用
char
而不是
TCHAR
——如果您使用定义的
UNICODE
编译此文件,它将不起作用,您正在访问未分配的内存。

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

您可能还想显式地使用
char
而不是
TCHAR
——如果您在编译时定义了
UNICODE
,那么它将不起作用,您正在访问未分配的内存。

sizeof(文件)
这部分是错误的。您想将
Size
放入其中。
sizeof(文件)
提供变量
文件的大小(对应于指针的大小,即4或8字节),而不是文件本身的大小

您应该检查
ReadFile

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

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

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

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

您应该检查
ReadFile

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

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



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

是否应该改为
fileSize
大小
Size
?可能重复:By
返回0
您的意思是
numlinefile
最后为0?回答问题后,没有理由删除您的代码。您应该这样做保留它,以防将来的程序员遇到与您相同的问题。
fileSize
是否应该改为
Size
?可能的重复:By
返回0
您的意思是
numlinefile
最后为0?一旦您的问题得到回答,就没有理由删除您的代码。您应该保留它,以防将来的程序出现问题r与您有相同的问题。谢谢,这是一个bug,但还有另一个bug。它仍然返回2…您发布的代码是从真实代码中提取出来的-您正在使用变量
fileSize
,该变量未在您的帖子中定义。@rad2您没有。此代码不完整。并且仍然存在
大小
vs
文件ize
问题。@rad2:现在将
TCHAR*文件
更改为
char*文件
您的文件是utf-16还是utf-8/ascii?谢谢,这是一个错误,但仍然存在另一个错误。它仍然返回2…您发布的代码是从真实代码中提取出来的-您正在使用的变量
fileSize
,它在您的帖子中没有定义。@rad2没有。此代码不完整。仍然存在
Size
vs
fileSize
问题。@rad2:现在将
TCHAR*文件更改为
char*文件
您的文件是utf-16还是utf-8/ascii?您仍然存在潜在的widechar问题(您是以Unicode还是Ansi编译的?)你不需要检查
ReadFile
的结果,也不需要检查
bytesRead
的内容。文件编码和编译时使用的字符类型是完全独立的。如果你使用
TChar
并假设它是1字节,那么在编译为unicode时它将不起作用。对于UTF-16编码的文本文件,你无论如何都需要特殊处理。我知道确保文件读取正确(我可以在调试器中看到),但如何计算行数?您仍然存在潜在的widechar问题(您是以Unicode还是Ansi编译的?)你不需要检查
ReadFile
的结果,也不需要检查
bytesRead
的内容。文件编码和编译时使用的字符类型是完全独立的。如果你使用
TChar
并假设它是1字节,那么在编译为unicode时它将不起作用。对于UTF-16编码的文本文件,你无论如何都需要特殊处理。我知道确保文件读取正确(我可以在调试器中看到),但如何计算行数?