无法通过 fopen() 打开文件

Cannot open a file through fopen()

我正在用 C++ 制作一个模拟器,为此我需要读取文件。

我的目录看起来像这样

proj
------>bin        #stores the executable
------>include    #stroes the external library includefiles
------>lib        #stores the lib files of the libraries
------>obj        #stores the .o files
------>src        #source files
makefile


我的 make 文件是这样的

CC = g++
OUT = chip8
ODIR = ./obj
SDIR = ./src
OUTDIR = ./bin
IDIR = ./include
LDIR = ./lib
libs = -lmingw32 -lSDL2main -lSDL2 -lSDL2_image
OBJS = $(patsubst $(SDIR)/%.cpp,$(ODIR)/%.o,$(wildcard $(SDIR)/*.cpp))
vpath %.cpp $(SDIR):$(SDIR)/Chip8

$(ODIR)/%.o : %.cpp
    $(CC) -c -I $(IDIR) -o $@ $^

$(OUTDIR)/% : $(wildcard obj/*.o)
    $(CC) -L $(LDIR) -o $@ $^ $(libs)

.PHONY : run

run :
    $(OUTDIR)/$(OUT)


这些是我的源文件

main.cpp


#include <iostream>
#include "Chip8/RomFileReader.h"


int main(){

    RomReader romReader;

    if(romReader.OpenFile("picture.ch8") == -1){
        std::cout<<"could not open file !"<<std::endl;
        return EXIT_FAILURE;
    }

    romReader.GetRom();

    uint8_t * rom = romReader.ReturnRom();
    int size = romReader.GetRomSize();

    for(int i = 0; i<size; i++)
        std::cout<<rom[i]<<std::endl;

    free(rom);

    romReader.FreeRom();
    romReader.CloseReader();

}

ReadRomFile.h

#pragma once 

#include <iostream>
#include <stdlib.h>
#include <inttypes.h>
#include <stdio.h>

class RomReader{

private :

    FILE * m_Reader;
    uint8_t * m_Rom; 

public : 

    int OpenFile(const char * fileName);
    void GetRom();
    void FreeRom();
    uint8_t * ReturnRom();
    void CloseReader();
    int GetRomSize();

};

RomFileReader.cpp


#include "RomFileReader.h"

int RomReader :: OpenFile(const char * fileName){

    m_Reader = fopen(fileName,"rb");

    if(m_Reader == NULL){
        return -1;
    } else 
        return 1;

}

int RomReader :: GetRomSize(){
    
    int start = ftell(m_Reader);
    fseek(m_Reader,0,SEEK_END);
    int end = ftell(m_Reader);
    fseek(m_Reader,0,SEEK_SET);

    int size = end - size;

    return size;

}

void RomReader :: GetRom(){

    int size = GetRomSize();

    if(m_Rom == NULL){
        m_Rom = new uint8_t[size];
    }

    fread(m_Rom,1,size,m_Reader);

}

void RomReader :: FreeRom(){

    free(m_Rom);

}

uint8_t * RomReader :: ReturnRom(){

    return m_Rom;

}


void RomReader :: CloseReader(){

    fclose(m_Reader);

}

这是我遇到的错误


./bin/chip8
could not open file !      
make: *** [run] Error 1   

我可以使用 fstream,但我更愿意使用 FILE,也更有信心,我在 c 中做了类似的事情,并且没有任何问题。

我真的无法指出什么地方不起作用。

我的 picture.ch8 与可执行文件一起位于 bin 文件夹中,但我收到此错误。我到底错过了什么?

您遇到的基本问题是 wildcard 扩展到 make 读取 makefile 时存在的文件。因此,当您使用干净的树(obj 目录为空)构建时,它会扩展为空,因此不会构建任何内容。

结果是 wildcard 不能有效地用于作为构建的一部分生成的中间文件,因为它们在构建时可能尚不存在。它仅对查找 source 文件有用。

你需要像

这样的东西
$(OUTDIR)/$(OUT): $(patsubst src/%.cpp, obj/%.o, $(wildcard src/*.cpp)) $(patsubst src/Chip8/%.cpp, obj/%.o, $(wildcard src/Chip8/*.cpp))

您可能还希望 run 目标依赖于可执行文件

run: $(OUTDIR)/$(OUT)

否则当您尝试 运行 时它不会(重新)构建它。

您的主线正在呼叫

romReader.FreeRom();

我认为 m_Rom 不是 NULL。所以内存被释放,所以内存异常被触发?!?

在 class:

的构造函数中将其设置为 NULL
class RomReader {

...
public : 
  RomReader() { m_Rom = NULL; };
  ~RomReader() { if ( m_Rom != NULL ) delete [] m_Rom; };
...
}