计算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;isizeof(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
vsfileSize
问题。@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编码的文本文件,你无论如何都需要特殊处理。我知道确保文件读取正确(我可以在调试器中看到),但如何计算行数?