2010-03-02 130 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]; 

雖然,很多其他的變化我想在這裏做中,你可以完全處理每個循環迭代一個文件,避免完全名稱的數組。

相關問題