我正在尝试编写一个简单的程序,将二进制文件的内容打开到缓冲区中,并搜索缓冲字符串的出现,即'+'字符。即使我的算法有点片状,似乎确实找到了这些字符。一旦找到它,它就会将角色更改为其他角色。然后它将相同的缓冲区写回文件。它不起作用,因为我尝试在十六进制编辑器中打开文件,但找不到包含新字符的新字符串。被修改的文件打印出我尝试使用fread和fwrite修改的字符串。
以下是代码:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
using namespace std;
char XyZ[] = "++++++++++++++++++++++++++"; //26 count
int main()
{
int error = 0;
FILE * pFile;
unsigned int lSize;
char * buffer;
size_t result;
int i = 0, j = 0;
bool bfound = false;
int count = 0;
int startLocation = 0;
pFile = fopen ( "E:\\DEVS\\Projects\\JustTesting\\FOpen\\Release\\Test.exe", "rb+" );
if (pFile==NULL)
{
cout << "Unable to open Test.exe" << endl;
cout << GetLastError() << endl;
}
else
{
cout << "Successfully opened the file" << endl;
// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);
cout << "Number of file size is " << lSize << endl;
// allocate memory to contain the whole file:
buffer = (char*) malloc (sizeof(char)*lSize);
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
// copy the file into the buffer:
result = fread (buffer,1,lSize,pFile);
cout << "Total bytes read into our buffer is " << result << endl;
if (result != lSize)
{
cout << "Error in reading the file" << endl;
}
else
{
for(i = 0; i < lSize; i++)
{
if(buffer[i] == '+') // '+'
{
//cout << "Found first one" << endl;
startLocation = i;
//j = i + 1;
//cout << "Found the next one" << endl;
while(buffer[++i] == '+')
{
buffer[i] = '@';
cout << "Found the next one" << endl;
count++;
}
}
}
cout << "Found our string with count " << count << endl;
}
//for(int k = startLocation; k < startLocation + 5; k++)
// buffer[k] = '@';
int value = fwrite (buffer , 1 , lSize , pFile );
cout << "bytes written to file is :" << value << endl;
fclose (pFile);
free (buffer);
}
return 0;
}
答案 0 :(得分:1)
第一个问题是您的while
:
while(buffer[++i] == '+')
所以你找到了+
,但是在while
中你先增加位置,然后测试该值是否仍为+
。如果你只有一个+
(如果你有几个,第一个没有被覆盖),那就失败了。相反,将其替换为:
for ( ; (buffer[i] == '+') && (i < lSize) ; i++)
下一个问题是在fread
之后,文件位置在最后。因此,您对fwrite
的调用将附加修改后的缓冲区。要实际覆盖该文件,首先需要再次调用rewind(pFile);
。
关于fread
/ fwrite
的最后一点说明:您读取和写入lSize
个项目,每个项目大小为1个字节。这很慢(尝试使用1兆字节的文件)。相反,你可能想要相反:
result = fread(buffer, lSize, 1, pFile);
请注意,result
只会成功1
。这同样适用于fwrite
。
答案 1 :(得分:0)
请注意,您将尝试在文件末尾写入修改后的内容。此外,在读写操作之间切换需要在它们之间进行某些函数调用以切换操作模式。尝试添加
fseek( pFile, 0, SEEK_SET );
在做fwrite
之前。请注意,可能仍有问题
答案 2 :(得分:0)
你在rb
打开文件(供阅读),然后写信给我......我不确定它会做你想做的事。