在 C++ 函数中打开文件后如何关闭文件
how can i close files after open them in a function in c++
我致力于使用可扩展哈希来更快地找到查询。我的代码是以下步骤:1)读取主文本文件(Hudge文件4 GiB)该文件是这样的:
12435 alex romero
13452 jack robert
13485 marya car
45132 gun tribble
...
用户想知道例如密钥 12435 与什么有关?(答案:亚历克斯·罗梅罗)
2)为文件中的键创建一个哈希表(我的意思是12435,13452,13485,...)我将此表动态保存在硬盘中的一些文本文件中,名为:0.txt,1.txt,2.txt 和....
3)当用户对程序进行查询时,程序必须根据其值计算哈希函数并找到必须读取的文件,然后更快地找到结果。
我有一个功能:
#define LIMIT 7
void writeInFile(int key , const char* charPos ){
int remainder = key%(LIMIT*LIMIT);
string myFileName;
ostringstream convert;
convert << remainder ;
myFileName = convert.str();
myFileName += ".txt";
FILE *my_file;
my_file = fopen(myFileName.c_str() ,"a");
fputs("n" ,my_file);
fputs(charPos , my_file);
//fclose(my_file);
}
我想知道当我使用fclose
时,程序的速度会降低!!然后我不在函数结束时使用它,但问题是当我多次使用此功能时,我无法关闭它们,然后我无法访问文件。我想创建一个 FILE 的"列表",我可以将它们的引用发送到函数,例如:FILE &* myFiles[]
或FILE &** myFiles
作为函数获得的第 3 个参数......但是我看到错误.我不知道它的语法如何.i意味着一些语法,例如:
void writeInFile(int key , const char* charPos , FILE &*myFiles[] ) // this makes error
我认为的另一种方法是我可以关闭那些现在无法访问它们的文件吗? 或者我可以更改导致此问题的代码吗?
更新:这是我的完整代码
#include <iostream>
#include <fstream>
#include <limits>
#include <string>
#include <sstream>
#include <stdio.h>
#include <vector>
#define LIMIT 7
using namespace std;
void writeInFile(int key , const char* charPos ){
int remainder = key%(LIMIT*LIMIT);
string myFileName;
ostringstream convert;
convert << remainder ;
myFileName = convert.str();
myFileName += ".txt";
FILE *my_file;
my_file = fopen(myFileName.c_str() ,"a");
fputs("n" ,my_file);
fputs(charPos ,my_file);
//fclose(my_file);
}
int main(){
string fileName;
cout << "hello, please inter your file destination : " ;
cin >> fileName;
ifstream myFile ;
myFile.open(fileName.c_str() ,ifstream::in |ifstream::binary);
cout << "building the hash,please wait";
string havij;//:D this is an unusable variable in this section :))
int current;
int index;
int isCout=0;
char buffer [10];
//FILE *my_file[49];
while(!myFile.eof()){
cout << isCout << endl;
isCout++;
index = myFile.tellg();
itoa(index , buffer ,10);
//cout << buffer << endl;
myFile >> current;
writeInFile(current ,buffer);
getline(myFile,havij);
}
myFile.close();
fstream test;
//for(int i =0 ; i<LIMIT*LIMIT-1 ; i++){
// fclose(my_file[i]);
//}
cout << endl << "static extensible hash structure builded please inter your query : " ;
int query;
cin >> query;
int remainder = query%(LIMIT*LIMIT);
string myFileName;
ostringstream convert;
convert << remainder ;
myFileName = convert.str();
myFileName += ".txt";
ifstream myFile2;
//myFile2 is now the files that create by program like : 12.txt ,25.txt ,....
myFile2.open(myFileName.c_str() , ifstream::in | ifstream::binary);
ifstream mainFile;
mainFile.open(fileName.c_str(), ifstream::in | ifstream::binary);
int position;
string wanted;
int tester;
while(!myFile2.eof()){
myFile2 >> position;
mainFile.seekg(position ,ios::beg);
mainFile >> tester;
if (tester == query ){
getline(mainFile ,wanted);
cout << "the result of the key " << tester << " is " << wanted << endl;
}
}
return 0;
}
你可以这样做:
void writeInFile(int key , const char* charPos , std::vector<std::ofstream> & myFiles );
我发现这让我的大脑不那么痛。
声明 FILE* 变量的同一上下文中关闭文件,则会泄漏该文件描述符。在某些时候,您将耗尽资源,程序将崩溃。
由于您使用的是所显示的代码片段中的C++,那么最好使用 std::vector 和 std::ofstream。
void writeInFile(int key, const char* charPos, std::vector<std::ofstream> my_files )
如前所述,您应该在打开的范围内关闭文件。这是C++流的默认行为。
但是,这并不意味着您应该为添加的每个单词打开/关闭!只要您有要添加到其中的内容,您写入的文件就应该保持打开状态(请注意,操作系统可以处理的文件描述符数量是有限制的)。
因此,您应该拥有:
- 打开所有目标文件 (*)
- 对于每一行,在表/映射中选择适当的文件并写入其中
- 关闭所有目标文件
(*) 如前所述,您可能会遇到硬限制,在这种情况下,您无能为力,如果您的哈希函数有任何价值,缓存不太可能有效。一种可能性是对大文件进行多次运行,并在每次运行时仅保存部分哈希(例如运行 1:[0-9] 中的哈希,运行 2:[10-19] 中的哈希,...)。
您使用的基本类型FILE*
或ofstream
并不重要,两者都具有相当的速度(正确调整)。
- 为什么未关闭的文件大小为 4 字节
- 保存文件并使控制台不关闭:Visual Studio 2019
- 我需要编写一个程序来读取一个文件,该文件将输出所有唯一的整数,如果已经看到整数,它将被关闭
- 有没有办法关闭文件? fclose 不能很好地工作
- 在 Win32 应用中,如果未选择文件夹并且用户单击"确定",则文件夹选择对话框将关闭
- 在 Visual Studios 中关闭 rc 资源文件的编辑
- 在C++中,关闭类成员函数内的静态文件流
- 我的循环未完成,当文件到达文件末尾时如何关闭它
- Visual C 关闭文本文件和打开新的控制台窗口
- CPP 控制台,关闭时,打开另一个 cpp 文件
- 有没有办法修复因未正确关闭 boost::archive::binary_oarchive 而损坏的文件?
- 如何判断 QFileDialog 是否已关闭而不选择文件
- 关闭VXWorks中非响应设备文件的端口的正确方法是什么?
- 我可以在不使用 FIOCANCEL 的情况下关闭 VxWorks 中的文件描述符吗?
- 串行端口:读取文件和关闭句柄
- C 如何通过同一MFC应用程序通过System Command打开Excel文件后关闭CMD EXE
- 文件打开/关闭状态引发意外异常
- 最佳实践:文件打开/关闭操作
- 是否需要在写入文件后和读取文件之前关闭文件?
- 打开文件和关闭文件声明定位:最佳做法,优点,缺点