我正在实现自己的读取功能,该功能将文件中的内容读入缓冲区。它成功读取了文件中的信息,但是当我打印出信息时,它将垃圾空字节'\ 00 \'附加到输出中。 所以我读的输出可能是“hi \ 00 \ 00 \ 00th \ 00 \ 00 \ 00er \ 00e”,当读到“hi there”时,我不知道是什么导致了这一点,任何帮助都表示赞赏。我不确定它是否重要,但每次2个字符后出现'\ 00 \'。
bool FileRead(int ptrBuffer, int bufferSize, int fid)
{
if (bufferSize == 0)
{
DEBUG('p', "Cannot read zero bytes.\n");
machine->WriteRegister(2, -2);
return false;
}
char *buffer = (char *)malloc(sizeof(char *) * (bufferSize +1));
DEBUG('p', "Attempting to read %d bytes from file %d\n", bufferSize, fid);
// Read bytes from the file.
OpenFile* file = openFileTable[fid - FID_OFFSET];
if (file == NULL) {
DEBUG('p', "File does not exist!\n");
machine->WriteRegister(2, -4);
return false;
}
file->Read(buffer, bufferSize + 1);
int len = strlen(buffer);
DEBUG('p', "Read string %s with len %d\n", buffer, len);
buffer[len] = '\0';
strcpy(&machine->mainMemory[ptrBuffer], buffer);
machine->WriteRegister(2, len-1);
return true;
}
答案 0 :(得分:2)
以下几行似乎非常可疑:
file->Read(buffer, bufferSize + 1);
int len = strlen(buffer);
buffer[len] = '\0';
在这里,您尝试使用strlen
来获取您读取的缓冲区的长度,strlen
显式期望传递的字符串终止。您然后将缓冲区作为字符串终止。如果缓冲区不包含终结符,则使用Read
函数将导致未定义的行为。
auto len = file->Read(buffer, bufferSize);
if (len > 0)
{
buffer[len] = '\0';
... (the rest of the code) ...
}
函数很可能返回它读取的长度(通常是这样),这意味着如果它的值长度需要使用该值(并且读取少一个字符) :
if (recycleView.getChildCount() == items.size()){
mLayoutManager.setStackFromEnd(true);
}
else{
mLayoutManager.setStackFromEnd(false);
}
另外,在尝试打印之前,请先停止。
答案 1 :(得分:1)
您不是以空值终止您读取的字节,而且还忽略了实际读取的字节数:
int case1 = 0;
int case2 = 0;
int case3 = 0;
int case4 = 0;
for(int i = 0; i < 100; i++)
{
double probability = Math.random();
if(probability < 0.25)
{
/* case 1 */
case1++;
}
else if(probability < 0.5 && probability > 0.25)
{
/* case 2 */
case2++;
}
else if(probability < 0.75 && probability > 0.5)
{
/* case 3 */
case3++;
}
else
{
/* case 4 */
case4++;
}
}
System.out.println("Number of different cases");
System.out.println("Case 1 = " + case1);
System.out.println("Case 2 = " + case2);
System.out.println("Case 3 = " + case3);
System.out.println("Case 4 = " + case4);
应该是:
file->Read(buffer, bufferSize + 1);
答案 2 :(得分:1)
在行char *buffer = (char *)malloc(sizeof(char *) * (bufferSize +1));
中,您试图将bufferSize数量的POINTER分配给字符。
您真正想要分配的是:
char *buffer = (char *)malloc(sizeof(char) * (bufferSize +1));
或更简单:
char *buffer = (char *)malloc(bufferSize + 1);
编辑: 顺便说一句,不熟悉“OpenRead”类等,所以不确定那些读取内容是做什么的等等。不确定它是否有返回值。
另一件需要注意的事情是,假设 - &gt; read方法与null一样终止字符串的预期,那么strlen确实会给你字符串中的字节数。
您需要确保的是strcpy的目标是否有缓冲内容的空间。更安全的副本可能是使用strncpy(dst,src,len)调用。