2010-03-02 131 views
0

我正在使用C++对多个大文件进行排序。我有一个文本文件,其中包含所有输入文件的名称,每行一个。我想一次读取一个文件名,将它们存储在一个数组中,然后用这些名称创建一个文件。现在,我正在使用fopen和fread,它们需要字符数组(我试图优化速度),所以我的文件名被读入字符数组数组中。但是,这些数组需要事先确定最大大小,所以如果文件名小于最大值,其余的就会被垃圾填满。然后,当我尝试在fopen()中使用该数组作为文件名时,它无法识别该文件,因为它在该字符串的末尾有垃圾。我怎么解决这个问题?这里是我的代码:从另一个文件中的文件名创建文件C++

#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

回答

5

正如唐克努特说,过早的优化是所有罪恶的根源。

你的文件名绝对不是瓶颈!只需使用std::string即可。

但是,您需要将fp = fopen(tempfname[i], "w");替换为fp = fopen(tempfname[i].c_str(), "w");

1

您正在使用C语言习语,如果您使用C++进行Google文件处理会更好。如果你是C程序员,这有点奇怪,但它绝对值得努力解决如何做C++方法。

2

忘记在这个阶段optomizing。
使用std::vector<std::string>并让您的程序工作。 一旦工作,如果速度真的很关键,那么你可以回去改变它

0

如果你一次只读取一行文件,那么你可以只分配每一行所需的空间量并以这种方式建立你的阵容。

我可以理解,这可能对您而言不够快,所以作为替代方案。我建议

  1. 获取文件
  2. 的大小分配该尺寸
  3. 将整个文件读入缓冲区的缓冲区。
  4. 扫描缓冲器中char类型的矢量与\ 0替换\ r和\ n和存储每个行的起始*
1

您需要添加一个空字节和剥去新行,以便写在您的第一个for循环中的for循环,该循环搜索换行符并将其替换为空字节。

虽然其他人是正确的,你是在你的优化尝试严重误导。

并确保你释放你的malloc。你应该使用STL的另一个很好的理由。

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]; 

虽然,很多其他的变化我想在这里做中,你可以完全处理每个循环迭代一个文件,避免完全名称的数组。

相关问题