我正在使用C ++对几个大文件进行排序。我有一个文本文件,其中包含所有输入文件的名称,每行一个。我想一次读取一个文件名,将它们存储在一个数组中,然后用这些名称创建一个文件。现在,我正在使用fopen和fread,它需要字符数组(我试图优化速度),所以我的文件名被读入一个字符数组数组。但是,这些数组需要预先确定最大大小,因此如果文件名小于最大值,则其余数据充满了垃圾。然后,当我尝试在fopen()中使用该数组作为文件名时,它无法识别该文件,因为它在字符串的末尾有垃圾。我怎么解决这个问题?这是我的代码:
#include <iostream>
#include <fstream>
#include <string>
#include "stdafx.h"
#define NUM_INPUT_FILES 4
using namespace std;
FILE *fp;
unsigned char *buff;
FILE *inputFiles[NUM_INPUT_FILES];
int _tmain(int argc, _TCHAR* argv[])
{
buff = (unsigned char *) malloc(2048);
char j[8];
char outputstring[] = "Feelings are not supposed to be logical. Dangerous is the man who has rationalized his emotions. (David Borenstein)";
fp = fopen("hello.txt", "r");
string tempfname[NUM_INPUT_FILES];
//fp = fopen("hello.txt", "r");
for(int i=0;i<NUM_INPUT_FILES;i++)
{
fgets(tempfname[i], 20, fp);
cout << tempfname[i];
}
fclose(fp);
for(int i=0; i<NUM_INPUT_FILES;i++)
{
fp = fopen(tempfname[i], "w");
//fwrite(outputstring, sizeof(char), sizeof outputstring/sizeof(char), fp);
if(fp)
{
fclose(fp);}
else
cout << "sorry" << endl;
}
return 0;
}
另外,如何使用fwrite()来找到缓冲区的大小?
非常感谢, BSG
答案 0 :(得分:5)
正如Don Knuth所说,过早优化是万恶之源。
你的文件名绝对不是瓶颈!只需使用std::string
即可。
但是,您需要将fp = fopen(tempfname[i], "w");
替换为fp = fopen(tempfname[i].c_str(), "w");
。
答案 1 :(得分:2)
在此阶段忘记选择
使用std::vector<std::string>
让您的程序正常运行。
一旦它工作,如果速度真的那么重要,那么你可以回去改变它
答案 2 :(得分:1)
你使用的是C型惯用语,如果你在C ++中使用谷歌文件处理会更好。如果你是一个C程序员,这有点奇怪,但它绝对值得努力找出如何用C ++方式做事
答案 3 :(得分:1)
你需要添加一个空字节并去除新行,所以在第一个for循环中写一个for循环来搜索换行并用空字节替换它。
虽然其他人是正确的,但您在优化尝试中被严重误导。
并确保你释放你的malloc。你应该使用STL的另一个好理由。
答案 4 :(得分:0)
如果您一次只读取一行文件,则可以只为每行所需的行分配空间量,并以这种方式构建行数组。
我可以理解,这对你来说可能不够快,所以作为另一种选择。我可以建议
答案 5 :(得分:0)
我和其他所有人在一起,这是不成熟的优化。
我不知道fgets(tempfname[i], 20, fp);
如何编译,更不用说工作了,因为tempfname[i]
是string&
而fgets
需要char*
。
可能你想要
typedef char file_name[20]; // way too short
file_name tempfnames[NUM_INPUT_FILES];
虽然在这里我会做的许多其他更改中,您可以在每次循环迭代时完全处理一个文件,并避免完全使用一个名称数组。