从另一个文件C ++中的文件名创建文件

时间:2010-03-02 21:03:00

标签: c++ fopen fread character-arrays

我正在使用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

6 个答案:

答案 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)

如果您一次只读取一行文件,则可以只为每行所需的行分配空间量,并以这种方式构建行数组。

我可以理解,这对你来说可能不够快,所以作为另一种选择。我可以建议

  1. 获取文件的大小
  2. 分配该大小的缓冲区
  3. 将整个文件读入缓冲区。
  4. 扫描缓冲区,用\ 0替换\ r和\ n,并将每行的开头存储在char *类型的向量中

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

虽然在这里我会做的许多其他更改中,您可以在每次循环迭代时完全处理一个文件,并避免完全使用一个名称数组。