我需要从函数中读取二进制文件中的流。我希望通过引用该char *来调用它,以便最终指向流的开头。但是,我的每次尝试都没有更改指针,或导致内存访问冲突。
我从另一个函数调用该方法。
这里是调用函数:
APP_ERROR EncryptionHandler::encryptFile(char *file)
{
char *i_Stream = ""; // I get a compiler error if I dont initialize this
if(this->readFileStream("picture.png", i_Stream) != OPERATION_SUCCESSFUL) // Call the function and return a custom error, if the function does so
return ERROR_FILE_READING;
}
这里是读取文件的功能
APP_ERROR EncryptionHandler::readFileStream(char *fileName, char *Stream)
{
char *fileStream;
FILE *file = fopen(fileName, "rb");
// Some logic to get the file size
fileStream = new char[maxFileSize];
fread(fileStream, 1, maxFileSize, file); // Fill the stream with the fread function
fclose(file);
Stream = fileStream; // Set the given Pointer to my fileStream pointer
return OPERATION_SUCCESSFUL;
}
在调用函数中,变量i_Stream从未改变过。它仍然指向""这会导致我的程序出现问题 我没有得到这个,因为我设置了给定的指针=我的fileStream指针
然而,以下方法并不起作用:
this->readFileStream("picture.png", char &i_Stream);
i_Error EncryptionHandler::readFileStream(char *fileName, char **Stream)
this->readFileStream("picture.png", char *i_Stream);
i_Error EncryptionHandler::readFileStream(char *fileName, char &Stream)
像memcpy这样的程序我认为并不正确,因为我已经有了指向我的Stream的指针。他们还导致了访问冲突错误......
必须有一种简单的方法可以将我的文件读取函数中的流指针赋给我的调用方法变量...
我不能使用函数的返回值,因为我正在使用自己的Error系统,正如你所看到的......
它也是二进制数据,不欢迎使用任何字符串。
那么通过引用调用char数组的正确方法是什么?
答案 0 :(得分:3)
您应该将EncryptionHandler::readFileStream()
声明为
APP_ERROR EncryptionHandler::readFileStream(char *fileName, char *&Stream)
请注意参数Stream
的类型。通过引用指针,您可以将Stream
内readFileStream()
的更改传递给调用者。
如果没有引用,指针只需复制到readFileStream()
。
答案 1 :(得分:0)
除了@timrau所说的,我还看到了内存分配问题。我没有看到任何代码分配内存来保存您从文件中读取的数据。类似下面的代码应该可以工作。
PP_ERROR EncryptionHandler::readFileStream(char *fileName, char*& Stream)
{
char *fileStream;
FILE *file = fopen(fileName, "rb");
// Some logic to get the file size
// Allocate memory for the data.
fileStream = new char[maxFileSize];
fread(fileStream, 1, maxFileSize, file); // Fill the stream with the fread function
fclose(file);
Stream = fileStream; // Set the given Pointer to my fileStream pointer
return OPERATION_SUCCESSFUL;
}
只需使用Stream
即可简化功能。
PP_ERROR EncryptionHandler::readFileStream(char *fileName, char*& Stream)
{
FILE *file = fopen(fileName, "rb");
// Some logic to get the file size
// Allocate memory for the data.
Stream = new char[maxFileSize];
fread(Stream, 1, maxFileSize, file); // Fill the stream with the fread function
fclose(file);
return OPERATION_SUCCESSFUL;
}