File.exe вызвал точку останова из-за Fseek - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь определить размер файла, который я читаю, в байтах, поэтому я использовал Fseek, чтобы перейти к концу, и это вызвало ошибку: file.exe вызвал точку останова. Хесес код: FileUtils. cpp: #include "FileUtils.h"

namespace impact {

    std::string read_file(const char* filepath)
    {
        FILE* file = fopen(filepath, "rt");
        fseek(file, 0, SEEK_END);
        unsigned long length = ftell(file);
        char* data = new char[length + 1];
        memset(data, 0, length + 1);
        fseek(file, 0 ,SEEK_SET);
        fread(data, 1, length, file);
        fclose(file);

        std::string result(data);
        delete[] data;
        return result;
    }

}

FileUtils.h:

    #pragma once
#include <stdio.h>
#include <string>
#include <fstream>


namespace impact {
    std::string read_file(const char* filepath);
}

Если требуется дополнительная информация, просто спросите меня, я был бы более чем рад предоставить больше!

1 Ответ

0 голосов
/ 27 февраля 2020

Вы делаете это способом C, C ++ имеет гораздо лучшие (на мой взгляд) способы обработки файлов.

Ваша ошибка выглядит так: может быть вызвано тем, что файл не открылся правильно (вам нужно проверить, если file != nullptr).

Чтобы сделать это в C ++ 17, вы должны использовать стандартную библиотеку filesystem (Примечание: вы также можете сделать это с C ++ 11 experimental/filesystem с использованием std::experimental::filesystem пространства имен)

Пример:

std::string read_file(const std::filesystem::path& filepath) {
    auto f_size = std::filesystem::file_size(filepath);
    ...
}

Кроме того, для чтения файла в C ++ вам не нужно знать размер файла. Вы можете использовать потоки:

std::string read_file(const std::filesystem::path& filepath) {
   std::ifstream file(filepath); // Open the file

   // Throw if failed to open the file
   if (!file) throw std::runtime_error("File failed to open");

   std::stringstream data; // Create the buffer
   data << file.rdbuf(); // Read into the buffer the internal buffer of the file
   return data.str(); // Convert the stringstream to string and return it
}

Как видите, способ сделать это на C ++ намного короче и намного проще в отладке (полезные исключения с описаниями выдают, когда что-то идет не так)

...