自定义读取生产垃圾

时间:2015-10-31 01:51:33

标签: c++

我正在实现自己的读取功能,该功能将文件中的内容读入缓冲区。它成功读取了文件中的信息,但是当我打印出信息时,它将垃圾空字节'\ 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;
}

3 个答案:

答案 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)调用。