无法通过 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; };
...
}
我正在用 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:
的构造函数中将其设置为 NULLclass RomReader {
...
public :
RomReader() { m_Rom = NULL; };
~RomReader() { if ( m_Rom != NULL ) delete [] m_Rom; };
...
}