Borland 5.5 C++ Ifstream 0xC0000005
Borland 5.5 C++ Ifstream 0xC0000005
我正在做一个学校项目,我的老师希望它在 Borland 5.5 中编译。该代码在 GNU GCC 编译器中运行良好,但在这里却一团糟。我追踪到使用 ifstream 的错误(我用它来读取 .txt 文件),但最让我困惑的是即使实例化 ifstream 也会崩溃。我将 post 完整代码和我使用 Ifstream 测试的两部分。
#include <iostream>
#include <fstream>
using namespace std;
ifstream arch_paises;
int main () {
cout << "End..." << endl;
return 0;
}
最后一行(打印“End”)甚至没有执行。但是...如果我更改 ifstream 位置...
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ifstream arch_paises;
cout << "End..." << endl;
return 0;
}
打印“结束”。无论如何,“返回的-1073741819”仍然存在。
我在这里 post 项目的全部代码,正如我所说的那样,它使用 GNU GCC 编译器完美运行。它从文本文件中读取一些数据,并对大流行病进行一些计算。
//------------------------------------------------------------------------------
// Librerias
#include <fstream>
#include <iomanip>
#include <iostream>
#include <string.h>
using namespace std;
//------------------------------------------------------------------------------
// Parametros de configuracion
const short MAX_PAIS = 200;
#define n_paises "Paises.txt"
#define n_partes "ParteDiario.txt"
//------------------------------------------------------------------------------
// Posibles titulos
const string titulo[] = {"Hisopados", "Infectados" , "Recuperados", "Fallecidos"};
//------------------------------------------------------------------------------
// Estructura con informacion mundial
struct tsGlobal{
short cp ; // Cantidad de paises
long poblacion ; // Poblacion mundial
long totales_globales[5]; // Hisopados(1) , Infectados(2) , Recuperados(3) , Fallecidos(4)
};
//------------------------------------------------------------------------------
// Estructura utilizada para los calculos
struct datos_paises{
char pais[20];
char cont[10];
unsigned short habs ;
unsigned short mensual[5][13] ; // [Hisopados(1) , Infectados(2) , Recuperados(3) , Fallecidos(4)] [mes]
unsigned short totales[5] ; // Hisopados(1) , Infectados(2) , Recuperados(3) , Fallecidos(4)
};
//------------------------------------------------------------------------------
// Estructura utilizada para la lectura de los partes diarios
struct tsParDia{
char pais[20];
unsigned short mes;
unsigned short dia;
unsigned short ch;
unsigned short ci;
unsigned short cf;
unsigned short cr;
};
//------------------------------------------------------------------------------
// Prototipos de modulos
void Abrir_archivo(ifstream &paises, ifstream &partes);
void ProcPaises(tsGlobal &i, datos_paises* tsC, ifstream &paises);
bool LeerPaises(datos_paises* r, short index,ifstream &paises);
void ProcParteDiarios( datos_paises* ps,tsGlobal &tsg, ifstream &partes, tsParDia tsPart);
bool LeerParte(ifstream &partes,tsParDia &tsPart);
void Ordenar(datos_paises* ps,int cantidad,int criterio);
void IntCmb(datos_paises &elem1,datos_paises &elem2);
void Listado(tsGlobal tsg,datos_paises* ps);
void Generar_contenido_archivo(datos_paises* estructura,short tipo,tsGlobal tsg,datos_paises* ps);
void archivo_formato(short tipo,ofstream &outfile,datos_paises* ps);
void archivo_body(short cantidadPaises,ofstream &outfile,short tipo,datos_paises* ps);
void archivo_footer(short tipo,ofstream &outfile, datos_paises* ps,tsGlobal tsg);
void Cerrar_archivo(ifstream &paises, ifstream &partes);
//+=============================================================================
// Bloque principal
//
int main() {
/*Declaracion de estructuras*/
datos_paises ps [MAX_PAIS];
tsParDia tsPartes;
tsGlobal tsGlb;
/*Archivos*/
ifstream arch_paises;
ifstream arch_partes;
/*Abro los archivos*/
Abrir_archivo(arch_paises, arch_partes);
/*Proceso la informacion del archivo de paises*/
ProcPaises(tsGlb, ps, arch_paises);
/*Proceso la informacion del archivo de partes diarios*/
ProcParteDiarios(ps, tsGlb, arch_partes, tsPartes);
/*Genero el listado*/
Listado(tsGlb,ps);
/*Cierro los archivos*/
Cerrar_archivo(arch_paises, arch_partes);
return 0;
}
//+=============================================================================
// Abro los archivos para lectura
//
void Abrir_archivo(ifstream &paises, ifstream &partes){
paises.open(n_paises);
partes.open(n_partes);
}
//+=============================================================================
// Proceso la linea y la almaceno en la posicion indicada de la struct
//
void ProcPaises(tsGlobal &i, datos_paises* tsC, ifstream &paises){
i.cp = 0;
while(LeerPaises(tsC, i.cp, paises)){
i.poblacion += tsC[i.cp].habs;
i.cp++;
}
}
//+=============================================================================
// Leo el archivo de paises y lo almaceno en la estructura interna
//
bool LeerPaises(datos_paises* r, short cp,ifstream &paises) {
paises.get(r[cp].pais,21, ' ');
paises >> ws;
paises.get(r[cp].cont,11, ' ');
paises >> ws;
paises >> r[cp].habs;
paises.ignore();
return paises.good();
} // Leer
//+=============================================================================
// Proceso la linea del parte y la almaceno en la posicion indicada de la struct
//
void ProcParteDiarios( datos_paises* ps,tsGlobal &tsg, ifstream &partes, tsParDia tsPart){
while(LeerParte(partes, tsPart)){
for(int c = 0; c < tsg.cp; c ++){
if(!strcmp(tsPart.pais,ps[c].pais)){
ps[c].mensual[1][tsPart.mes]+= tsPart.ch;
ps[c].totales[1] += tsPart.ch;
tsg.totales_globales[1] += tsPart.ch;
ps[c].mensual[2][tsPart.mes]+= tsPart.ci;
ps[c].totales[2] += tsPart.ci;
tsg.totales_globales[2] += tsPart.ci;
ps[c].mensual[3][tsPart.mes]+= tsPart.cr;
ps[c].totales[3] += tsPart.cr;
tsg.totales_globales[3] += tsPart.cr;
ps[c].mensual[4][tsPart.mes]+= tsPart.cf;
ps[c].totales[4] += tsPart.cf;
tsg.totales_globales[4] += tsPart.cf;
}
}
}
}
//+=============================================================================
// Leo el archivo de partes y lo almaceno en la estructura interna
//
bool LeerParte(ifstream &partes, tsParDia &tsPart) {
/*Nombre del pais*/
partes.get(tsPart.pais,21, ' ');
/*Descargo el mes*/
partes >> tsPart.mes;
/*Descargo el dia*/
partes >> tsPart.dia;
/*Descargo hisopados*/
partes >> tsPart.ch;
/*Descargo infectados*/
partes >> tsPart.ci;
/*Descargo fallecidos*/
partes >> tsPart.cr;
/*Descargo recuperados*/
partes >> tsPart.cf;
partes.ignore();
return partes.good();
} // Leer
//+=============================================================================
// Ordena el struct en funcion de un parametro especifico
//
void Ordenar(datos_paises* ps,int cantidad,int criterio){
bool cambios = true;
char grupos=cantidad/2;
while(grupos>1){
grupos = grupos/2;
cambios = true;
while(cambios){
cambios = false;
for (char i=0;i+grupos<cantidad;i++){
if(ps[i].totales[criterio] < ps[i+grupos].totales[criterio])
{
cambios=true;
IntCmb(ps[i],ps[i+grupos]);
}
}
}
}
}
//+=============================================================================
// Intercambia posiciones del Struct
//
void IntCmb(datos_paises &elem1,datos_paises &elem2){
datos_paises aux;
aux = elem1;
elem1 = elem2;
elem2 = aux;
}
//+=============================================================================
// Genero el listado de los distintos topicos y guardo en archivos
//
void Listado(tsGlobal tsg,datos_paises* ps){
for(int i = 1; i < 5; i++){
Ordenar(ps,tsg.cp,i); // Ordeno la estructura en funcion del parametro dado
Generar_contenido_archivo(ps,i,tsg, ps);
}
}
//+=============================================================================
// Genero el contenido de los archivos
//
void Generar_contenido_archivo(datos_paises* estructura,short tipo,tsGlobal tsg,datos_paises* ps){
ofstream outfile;
string nombre = "Listado" + titulo[tipo-1] + ".txt";
outfile.open(nombre.c_str());
archivo_formato(tipo,outfile,ps);
archivo_body(tsg.cp,outfile,tipo,ps);
archivo_footer(tipo,outfile,ps,tsg);
outfile.close();
}
//+=============================================================================
// Primera parte del archivo en donde plasmo el formato solicitado por el docente
//
void archivo_formato(short tipo,ofstream &outfile,datos_paises* ps){
/*Titulo*/
outfile << setw(100) << endl;
outfile << setw(77) << "Listado de " + titulo[tipo-1] << endl;
/*Linea 1*/
outfile << left << setw(10)<< "Nro.";
outfile << left << setw(20)<< "Nombre";
outfile << left << setw(10)<< "Cant.Hab";
/*Linea2*/
string auxiliar = "---------- Cantidades de " + titulo[tipo-1] + " por mes ----------";
outfile << left << setw(47)<< auxiliar;
outfile << right << setw(6) << "Cant.";
outfile << right << setw(15)<< "Porcentajes" <<endl;
outfile << left << setw(10)<< "Ord.";
outfile << left << setw(20)<< "Pais";
outfile << left << setw(10)<< "";
outfile << left << setw(8) << "Ene";
outfile << left << setw(8) << "Feb";
outfile << left << setw(8) << "Mar";
outfile << left << setw(8) << "Abr";
outfile << left << setw(8) << "May";
outfile << left << setw(8) << "Jun";
outfile << left << setw(7) << "Jul";
outfile << left << setw(10)<< "Tot." << endl;
}
//+=============================================================================
// Cuerpo del archivo... Coloco la info por pais
//
void archivo_body(short cantidadPaises,ofstream &outfile,short tipo,datos_paises* ps){
for(int i = 0; i < cantidadPaises ; i ++){
outfile << left << setw(10) << i+1;
outfile << left << setw(20) << ps[i].pais;
outfile << left << setw(10) << ps[i].habs;
outfile << left << setw(8) << ps[i].mensual[tipo][1];
outfile << left << setw(8) << ps[i].mensual[tipo][2];
outfile << left << setw(8) << ps[i].mensual[tipo][3];
outfile << left << setw(8) << ps[i].mensual[tipo][4];
outfile << left << setw(8) << ps[i].mensual[tipo][5];
outfile << left << setw(8) << ps[i].mensual[tipo][6];
outfile << left << setw(7) << ps[i].mensual[tipo][7];
outfile << left << setw(10) << ps[i].totales[tipo];
double porcentaje = ((double)ps[i].totales[tipo] / (double)ps[i].habs) * 100;
char aux[50];
sprintf(aux,"%.2f", porcentaje);
outfile << right << setw(6) << aux << "%" << endl;
}
}
//+=============================================================================
// Coloco el footer del archivo
//
void archivo_footer(short tipo,ofstream &outfile, datos_paises* ps,tsGlobal tsg){
string foot1 = "Cantidad total de " + titulo[tipo-1] + " a la fecha actual:";
outfile << endl << endl << left << foot1 << tsg.totales_globales[tipo] << endl;
double porcentaje = ((double) tsg.totales_globales[tipo] / (double)tsg.poblacion) * 100;
char aux[50];
sprintf(aux,"%.2f", porcentaje);
string foot2 = "Porcentaje de " + titulo[tipo-1];
outfile << left << setfill('.') << setw(foot1.length()-1) << foot2;
outfile << right << ":" << aux << "%" ;
}
//+=============================================================================
// Cerramos los archivos de lectura
//
void Cerrar_archivo(ifstream &paises, ifstream &partes){
paises.close();
partes.close();
}
代码编译没有错误或警告,但它没有运行 properly/entirely Boorland。
谢谢。
0xC0000005 是 Windows 内存访问冲突的异常代码。
一个例子是写入 NULL 地址。
ifstream
是 C++ 标准库的一部分,每个编译器都提供了自己的实现。
Borland C++ 5.5 是 20 years old,并非设计用于 OS 比 Windows 2000 更新的版本。
因为根据你的问题,错误是通过简单地实例化 ifstream
发生的,我相信问题出在 Borland 的 ifstream
实现中的某个地方,它与你更新的 OS 不兼容运行宁。
您可以尝试 运行 在兼容模式下生成的 EXE(如果您的 windows 版本仍然可用)。
另一种选择可能是避免使用 ifstream
并使用 C API 代替 fopen
、fread
或使用 WIN32 API CreateFile
and ReadFile
。
当然,除非你能说服你的老师更换编译器。
我正在做一个学校项目,我的老师希望它在 Borland 5.5 中编译。该代码在 GNU GCC 编译器中运行良好,但在这里却一团糟。我追踪到使用 ifstream 的错误(我用它来读取 .txt 文件),但最让我困惑的是即使实例化 ifstream 也会崩溃。我将 post 完整代码和我使用 Ifstream 测试的两部分。
#include <iostream>
#include <fstream>
using namespace std;
ifstream arch_paises;
int main () {
cout << "End..." << endl;
return 0;
}
最后一行(打印“End”)甚至没有执行。但是...如果我更改 ifstream 位置...
#include <iostream>
#include <fstream>
using namespace std;
int main () {
ifstream arch_paises;
cout << "End..." << endl;
return 0;
}
打印“结束”。无论如何,“返回的-1073741819”仍然存在。
我在这里 post 项目的全部代码,正如我所说的那样,它使用 GNU GCC 编译器完美运行。它从文本文件中读取一些数据,并对大流行病进行一些计算。
//------------------------------------------------------------------------------
// Librerias
#include <fstream>
#include <iomanip>
#include <iostream>
#include <string.h>
using namespace std;
//------------------------------------------------------------------------------
// Parametros de configuracion
const short MAX_PAIS = 200;
#define n_paises "Paises.txt"
#define n_partes "ParteDiario.txt"
//------------------------------------------------------------------------------
// Posibles titulos
const string titulo[] = {"Hisopados", "Infectados" , "Recuperados", "Fallecidos"};
//------------------------------------------------------------------------------
// Estructura con informacion mundial
struct tsGlobal{
short cp ; // Cantidad de paises
long poblacion ; // Poblacion mundial
long totales_globales[5]; // Hisopados(1) , Infectados(2) , Recuperados(3) , Fallecidos(4)
};
//------------------------------------------------------------------------------
// Estructura utilizada para los calculos
struct datos_paises{
char pais[20];
char cont[10];
unsigned short habs ;
unsigned short mensual[5][13] ; // [Hisopados(1) , Infectados(2) , Recuperados(3) , Fallecidos(4)] [mes]
unsigned short totales[5] ; // Hisopados(1) , Infectados(2) , Recuperados(3) , Fallecidos(4)
};
//------------------------------------------------------------------------------
// Estructura utilizada para la lectura de los partes diarios
struct tsParDia{
char pais[20];
unsigned short mes;
unsigned short dia;
unsigned short ch;
unsigned short ci;
unsigned short cf;
unsigned short cr;
};
//------------------------------------------------------------------------------
// Prototipos de modulos
void Abrir_archivo(ifstream &paises, ifstream &partes);
void ProcPaises(tsGlobal &i, datos_paises* tsC, ifstream &paises);
bool LeerPaises(datos_paises* r, short index,ifstream &paises);
void ProcParteDiarios( datos_paises* ps,tsGlobal &tsg, ifstream &partes, tsParDia tsPart);
bool LeerParte(ifstream &partes,tsParDia &tsPart);
void Ordenar(datos_paises* ps,int cantidad,int criterio);
void IntCmb(datos_paises &elem1,datos_paises &elem2);
void Listado(tsGlobal tsg,datos_paises* ps);
void Generar_contenido_archivo(datos_paises* estructura,short tipo,tsGlobal tsg,datos_paises* ps);
void archivo_formato(short tipo,ofstream &outfile,datos_paises* ps);
void archivo_body(short cantidadPaises,ofstream &outfile,short tipo,datos_paises* ps);
void archivo_footer(short tipo,ofstream &outfile, datos_paises* ps,tsGlobal tsg);
void Cerrar_archivo(ifstream &paises, ifstream &partes);
//+=============================================================================
// Bloque principal
//
int main() {
/*Declaracion de estructuras*/
datos_paises ps [MAX_PAIS];
tsParDia tsPartes;
tsGlobal tsGlb;
/*Archivos*/
ifstream arch_paises;
ifstream arch_partes;
/*Abro los archivos*/
Abrir_archivo(arch_paises, arch_partes);
/*Proceso la informacion del archivo de paises*/
ProcPaises(tsGlb, ps, arch_paises);
/*Proceso la informacion del archivo de partes diarios*/
ProcParteDiarios(ps, tsGlb, arch_partes, tsPartes);
/*Genero el listado*/
Listado(tsGlb,ps);
/*Cierro los archivos*/
Cerrar_archivo(arch_paises, arch_partes);
return 0;
}
//+=============================================================================
// Abro los archivos para lectura
//
void Abrir_archivo(ifstream &paises, ifstream &partes){
paises.open(n_paises);
partes.open(n_partes);
}
//+=============================================================================
// Proceso la linea y la almaceno en la posicion indicada de la struct
//
void ProcPaises(tsGlobal &i, datos_paises* tsC, ifstream &paises){
i.cp = 0;
while(LeerPaises(tsC, i.cp, paises)){
i.poblacion += tsC[i.cp].habs;
i.cp++;
}
}
//+=============================================================================
// Leo el archivo de paises y lo almaceno en la estructura interna
//
bool LeerPaises(datos_paises* r, short cp,ifstream &paises) {
paises.get(r[cp].pais,21, ' ');
paises >> ws;
paises.get(r[cp].cont,11, ' ');
paises >> ws;
paises >> r[cp].habs;
paises.ignore();
return paises.good();
} // Leer
//+=============================================================================
// Proceso la linea del parte y la almaceno en la posicion indicada de la struct
//
void ProcParteDiarios( datos_paises* ps,tsGlobal &tsg, ifstream &partes, tsParDia tsPart){
while(LeerParte(partes, tsPart)){
for(int c = 0; c < tsg.cp; c ++){
if(!strcmp(tsPart.pais,ps[c].pais)){
ps[c].mensual[1][tsPart.mes]+= tsPart.ch;
ps[c].totales[1] += tsPart.ch;
tsg.totales_globales[1] += tsPart.ch;
ps[c].mensual[2][tsPart.mes]+= tsPart.ci;
ps[c].totales[2] += tsPart.ci;
tsg.totales_globales[2] += tsPart.ci;
ps[c].mensual[3][tsPart.mes]+= tsPart.cr;
ps[c].totales[3] += tsPart.cr;
tsg.totales_globales[3] += tsPart.cr;
ps[c].mensual[4][tsPart.mes]+= tsPart.cf;
ps[c].totales[4] += tsPart.cf;
tsg.totales_globales[4] += tsPart.cf;
}
}
}
}
//+=============================================================================
// Leo el archivo de partes y lo almaceno en la estructura interna
//
bool LeerParte(ifstream &partes, tsParDia &tsPart) {
/*Nombre del pais*/
partes.get(tsPart.pais,21, ' ');
/*Descargo el mes*/
partes >> tsPart.mes;
/*Descargo el dia*/
partes >> tsPart.dia;
/*Descargo hisopados*/
partes >> tsPart.ch;
/*Descargo infectados*/
partes >> tsPart.ci;
/*Descargo fallecidos*/
partes >> tsPart.cr;
/*Descargo recuperados*/
partes >> tsPart.cf;
partes.ignore();
return partes.good();
} // Leer
//+=============================================================================
// Ordena el struct en funcion de un parametro especifico
//
void Ordenar(datos_paises* ps,int cantidad,int criterio){
bool cambios = true;
char grupos=cantidad/2;
while(grupos>1){
grupos = grupos/2;
cambios = true;
while(cambios){
cambios = false;
for (char i=0;i+grupos<cantidad;i++){
if(ps[i].totales[criterio] < ps[i+grupos].totales[criterio])
{
cambios=true;
IntCmb(ps[i],ps[i+grupos]);
}
}
}
}
}
//+=============================================================================
// Intercambia posiciones del Struct
//
void IntCmb(datos_paises &elem1,datos_paises &elem2){
datos_paises aux;
aux = elem1;
elem1 = elem2;
elem2 = aux;
}
//+=============================================================================
// Genero el listado de los distintos topicos y guardo en archivos
//
void Listado(tsGlobal tsg,datos_paises* ps){
for(int i = 1; i < 5; i++){
Ordenar(ps,tsg.cp,i); // Ordeno la estructura en funcion del parametro dado
Generar_contenido_archivo(ps,i,tsg, ps);
}
}
//+=============================================================================
// Genero el contenido de los archivos
//
void Generar_contenido_archivo(datos_paises* estructura,short tipo,tsGlobal tsg,datos_paises* ps){
ofstream outfile;
string nombre = "Listado" + titulo[tipo-1] + ".txt";
outfile.open(nombre.c_str());
archivo_formato(tipo,outfile,ps);
archivo_body(tsg.cp,outfile,tipo,ps);
archivo_footer(tipo,outfile,ps,tsg);
outfile.close();
}
//+=============================================================================
// Primera parte del archivo en donde plasmo el formato solicitado por el docente
//
void archivo_formato(short tipo,ofstream &outfile,datos_paises* ps){
/*Titulo*/
outfile << setw(100) << endl;
outfile << setw(77) << "Listado de " + titulo[tipo-1] << endl;
/*Linea 1*/
outfile << left << setw(10)<< "Nro.";
outfile << left << setw(20)<< "Nombre";
outfile << left << setw(10)<< "Cant.Hab";
/*Linea2*/
string auxiliar = "---------- Cantidades de " + titulo[tipo-1] + " por mes ----------";
outfile << left << setw(47)<< auxiliar;
outfile << right << setw(6) << "Cant.";
outfile << right << setw(15)<< "Porcentajes" <<endl;
outfile << left << setw(10)<< "Ord.";
outfile << left << setw(20)<< "Pais";
outfile << left << setw(10)<< "";
outfile << left << setw(8) << "Ene";
outfile << left << setw(8) << "Feb";
outfile << left << setw(8) << "Mar";
outfile << left << setw(8) << "Abr";
outfile << left << setw(8) << "May";
outfile << left << setw(8) << "Jun";
outfile << left << setw(7) << "Jul";
outfile << left << setw(10)<< "Tot." << endl;
}
//+=============================================================================
// Cuerpo del archivo... Coloco la info por pais
//
void archivo_body(short cantidadPaises,ofstream &outfile,short tipo,datos_paises* ps){
for(int i = 0; i < cantidadPaises ; i ++){
outfile << left << setw(10) << i+1;
outfile << left << setw(20) << ps[i].pais;
outfile << left << setw(10) << ps[i].habs;
outfile << left << setw(8) << ps[i].mensual[tipo][1];
outfile << left << setw(8) << ps[i].mensual[tipo][2];
outfile << left << setw(8) << ps[i].mensual[tipo][3];
outfile << left << setw(8) << ps[i].mensual[tipo][4];
outfile << left << setw(8) << ps[i].mensual[tipo][5];
outfile << left << setw(8) << ps[i].mensual[tipo][6];
outfile << left << setw(7) << ps[i].mensual[tipo][7];
outfile << left << setw(10) << ps[i].totales[tipo];
double porcentaje = ((double)ps[i].totales[tipo] / (double)ps[i].habs) * 100;
char aux[50];
sprintf(aux,"%.2f", porcentaje);
outfile << right << setw(6) << aux << "%" << endl;
}
}
//+=============================================================================
// Coloco el footer del archivo
//
void archivo_footer(short tipo,ofstream &outfile, datos_paises* ps,tsGlobal tsg){
string foot1 = "Cantidad total de " + titulo[tipo-1] + " a la fecha actual:";
outfile << endl << endl << left << foot1 << tsg.totales_globales[tipo] << endl;
double porcentaje = ((double) tsg.totales_globales[tipo] / (double)tsg.poblacion) * 100;
char aux[50];
sprintf(aux,"%.2f", porcentaje);
string foot2 = "Porcentaje de " + titulo[tipo-1];
outfile << left << setfill('.') << setw(foot1.length()-1) << foot2;
outfile << right << ":" << aux << "%" ;
}
//+=============================================================================
// Cerramos los archivos de lectura
//
void Cerrar_archivo(ifstream &paises, ifstream &partes){
paises.close();
partes.close();
}
代码编译没有错误或警告,但它没有运行 properly/entirely Boorland。
谢谢。
0xC0000005 是 Windows 内存访问冲突的异常代码。 一个例子是写入 NULL 地址。
ifstream
是 C++ 标准库的一部分,每个编译器都提供了自己的实现。
Borland C++ 5.5 是 20 years old,并非设计用于 OS 比 Windows 2000 更新的版本。
因为根据你的问题,错误是通过简单地实例化 ifstream
发生的,我相信问题出在 Borland 的 ifstream
实现中的某个地方,它与你更新的 OS 不兼容运行宁。
您可以尝试 运行 在兼容模式下生成的 EXE(如果您的 windows 版本仍然可用)。
另一种选择可能是避免使用 ifstream
并使用 C API 代替 fopen
、fread
或使用 WIN32 API CreateFile
and ReadFile
。
当然,除非你能说服你的老师更换编译器。