Ошибка Сегментации C ++, когда я пытаюсь что-то отслеживать после чтения файла в 2D-массив c-строк - PullRequest
0 голосов
/ 11 ноября 2019

Одна часть проекта madLibs, которую я делаю для своего класса cs124, включает чтение файла и помещение каждого слова / фразы между пробелами в двумерный массив (fileArray), где каждая строка состоит из отдельного слова. Проблема в том, что после того, как я прочитал файл, каждое выражение cout, которое я делаю, выдает ошибку Segmentation fault.

Мне не разрешено использовать строки, все должно быть c-string или char []. Максимальный предел ввода для файла .txt составляет 256, а для каждого слова в файле - 32 символа. Я использую testfile.txt для проверки своего кода;может не относиться к делу, но в файле просто есть текст: This is a test file to test the fileArray function in MadLibs project

#include <iostream>
#include <fstream>
using namespace std;

#define WORD_CHAR_LIMIT 32
#define ARRAY_SIZE 256

void readFile(char fileArray[][WORD_CHAR_LIMIT]);

int main()
{
   char fileArray[ARRAY_SIZE][WORD_CHAR_LIMIT];

   cout << "this is a test\n";
   readFile(fileArray);
   cout << "this is a test\n";
   return 0;
}

void readFile(char fileArray[][WORD_CHAR_LIMIT])
{
   char fileName[ARRAY_SIZE];
   cout << "Please enter the filename of the Mad Lib: ";
   cin >> fileName;

   ifstream fin(fileName);
   if (fin.fail())
      return;

   char data;
   int i = 0;
   int j = 0;

   fin >> data;
   while (!fin.eof())
   {
      if (data != ' ')
         fileArray[i][j] = data;
      else if (data == ' ')
      {
         i++;
         j = -1;
      }
      j++;
   }

   fin.close();
}

Первая метка отображается на экране, как и должна, но затем, после вызова readFile(), следующая метка выдает Segmentation fault (core dumped) когда я ожидаю того же, что и первый кут:

[nbird11@LinuxLab02 ~]$ g++ project09.cpp  
[nbird11@LinuxLab02 ~]$ a.out  
this is a test  
Please enter the filename of the Mad Lib: testfile.txt  
Segmentation fault (core dumped)

1 Ответ

1 голос
/ 11 ноября 2019

Вы можете заменить весь цикл while на:

while(fin >> fileArray[i]) ++i;

Обратите внимание, что while (!fin.eof()) не является хорошим тестом. Это не будет true до тех пор, пока вы на самом деле не попытаетесь прочитать за пределы конца файла.

Что касается причины ошибки сегментации, возможно, вы прочитали data один раз и повторно использовали его навсегда:

fin >> data; // here you read data

while (!fin.eof())        // will never be true since you don't read more than once
{
    // here you use data

    if (data != ' ')      // will always be true

    else if (data == ' ') // will never be true

    j++;                  // will just keep on going until you reach ARRAY_SIZE and then
                          // anything can happen. Undefined Behaviour.
}

Итак, вы получите этот первый символ в каждой итерации цикла и вскоре выйдете за пределы. Опять же, замена условия в цикле while поможет:

while (fin >> data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...