чтение из файла и копирование его в массив: Ошибка проверки времени выполнения # 2 - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь скопировать 65 536 строк из файла в массив int того же размера с помощью функции.
каждая строка содержит четыре шестнадцатеричные цифры.

Я также добавил _CRT_SECURE_NO_WARNINGS в свойствах => c / c ++ => определения препроцессора, потому что я продолжал получать предупреждения, потому что я использовал f_gets, а не f_gets_s для чтения из файла.

ошибка, которую я продолжаю получать:

Ошибка проверки времени выполнения # 2 - стек вокруг переменной 'temp' был поврежден.

при попытке печати массива я вижу, что все строки копируются, но последняя строка копируется дважды или, возможно, копируется один раз, но печатается дважды.
Я не понимаю, что я делаю не так.

Спасибо за помощь.

#include <stdio.h>
#define NUMBER_OF_LINES_MEMO 65536
#define NUMBER_OF_REGISTERS 16
#define CHARS_IN_LINE 5  
#define CHARS_IN_IMMEDIATE 5 
#define _CRT_SECURE_NO_WARNINGS

void createFromFile(FILE *fPtrReadMemin, int *meminLines){
  //create a new array of int numbers named meminLines, with the lines of memin text file
  //gets pointers for the file memin and for the array meminLines
    FILE *copyCreateFromFile = fPtrReadMemin;
    int i = 0;
    char temp[CHARS_IN_LINE]; //used for copying to the memory array
    int temp2;

    while (!feof(copyCreateFromFile))
    {
      fgets(temp, NUMBER_OF_LINES_MEMO, copyCreateFromFile);
      if (strcmp(temp, "")==0)
      {
            break;
      }
      temp2 = (int)strtol(temp, NULL, 16);
      meminLines[i] = temp2;
      printf("%04x\n", temp2);
      i++;
   }
}

int main(int argc, char* argv[]) 
{
    FILE*fPtrReadMemin;
    fPtrReadMemin = fopen(argv[1], "r"); //open Memin to read
    int meminLines[NUMBER_OF_LINES_MEMO]; // the memory  
    if (fPtrReadMemin == NULL) { //check if the files were open correctly
        printf("There was error using files\n");
        exit(1);
    }
    createFromFile(fPtrReadMemin, meminLines); //create the memory
    system("pause");
    fclose(fPtrReadMemin);//close all files
    return 0;
 }

1 Ответ

0 голосов
/ 03 мая 2018

Ваш буфер имеет длину CHARS_IN_LINE:

char temp[CHARS_IN_LINE]; //used for copying to the memory array

Но при вызове fgets вы предоставляете длину буфера NUMBER_OF_LINES_MEMO:

  fgets(temp, NUMBER_OF_LINES_MEMO, copyCreateFromFile);

Вы должны предоставить фактическую длину буфера temp для fgets.

  fgets(temp, CHARS_IN_LINE, copyCreateFromFile);

или даже лучше

  fgets(temp, sizeof temp, copyCreateFromFile);

Кроме того, длина строк в вашем файле не 4, а 5, потому что fgets добавляет \n в конце строки. Следовательно, CHARS_IN_LINE должно быть не менее 5.


Не имеет прямого отношения:

Вы можете оставить эту строку:

FILE *copyCreateFromFile = fPtrReadMemin;

и используйте непосредственно fPtrReadMemin вместо copyCreateFromFile.


Ваш тест конца файла неверный, лучше проверить, если fgets вернет NULL.

strcmp бесполезен, вы можете бросить его.

Общая исправленная и упрощенная функция:

void createFromFile(FILE *fPtrReadMemin, int *meminLines) {
  //create a new array of int numbers named meminLines, with the lines of memin text file
  //gets pointers for the file memin and for the array meminLines
  int i = 0;
  char temp[100]; // not using CHARS_IN_LINE but 100 which is a reasonable
                  // maximal file length.

  while (fgets(temp, sizeof temp, fPtrReadMemin) != NULL)
  {  
    meminLines[i] = (int)strtol(temp, NULL, 16);
    printf("%04x\n", meminLines[i]);
    i++;
  }
}

И вы забыли включить следующее:

#include <string.h>
#include <stdlib.h>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...