我知道我的错误是什么,无法解决问题。
我正在编写一个winAPI来计算找到'a'个字符的数量是一个givien文件。 我仍然得到错误“下标需要数组或指针”(请在代码中找到注释)
#include "stdafx.h"
#include <windows.h>
int _tmain(int argc, _TCHAR* argv[])
{
WCHAR str=L'a';
HANDLE A;
TCHAR *fn;
fn=L"d:\\test.txt";
A= CreateFile(fn,GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if(A==INVALID_HANDLE_VALUE)
{
_tprintf(L"cannot open file \n");
}
else
{
DWORD really;
int countletter;
int stringsize;
do
{
BYTE x[1024];
ReadFile(A,x,1024,&really,NULL);
stringsize = sizeof(really);
for(int i =0;i<stringsize;i++)
{
if(really[i]==str) //here Im getting the error
countletter++;
}
}while(really==1024);
CloseHandle(A);
_tprintf(L"NUmbers of A's found is %d \n",countletter);
}
return 0;
}
现在我知道我不能在数组和WCHAR之间进行比较但是要修复它吗?
答案 0 :(得分:1)
您的变量really
既不是数组也不是指针,因此下标(really[i]
)是非法的。
答案 1 :(得分:0)
ReadFile()
将数据放入 second 参数中,例如x
。
在您的代码中,really
是读取的字节数。这只是一个数字。你不能把一个下标放在普通数字上,因此就是错误信息。
所以改变
if(really[i]==str)
要
if (x[i] == str)
但你会遇到另一个问题:
DWORD really;
int countletter;
int stringsize;
do {
BYTE x[1024];
bool bResult = ReadFile(A, x, 1024, &really, NULL); // must save the result
if (bResult)
break; // Error!
// stringsize = sizeof(really); // <== NO NO NO will always return 8
stringsize = really; // this is what you need
for (int i = 0; i < stringsize; i++)
{
if(x[i] == str)
countletter++;
}
} while (really == 1024);
当然,您需要一些错误处理,真的需要有意义的变量名称。如果您使用inputBuffer
和bytesRead
代替x
和really
,那么您的问题就会很明显。
已编辑添加:
你的评论是正确的,我以前的编辑太过分了。确实,倒数第二个读取应该返回1024个字节,而 last 将返回&lt; 1024.但我仍然会在阅读后立即检查bytesRead == 0
,因为它更容易理解。