【问题标题】:Create files from file names in another file C++从另一个文件 C++ 中的文件名创建文件
【发布时间】:2010-03-02 21:03:00
【问题描述】:

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

【问题讨论】:

    标签: c++ fopen fread character-arrays


    【解决方案1】:

    正如 Don Knuth 所说,过早优化是万恶之源。

    您的文件名绝对不是瓶颈!只需为他们使用std::string

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

    【讨论】:

      【解决方案2】:

      在这个阶段忘记优化。
      使用std::vector&lt;std::string&gt; 并让您的程序正常工作。 一旦它工作了,如果速度真的那么重要,那么你可以回去改变它

      【讨论】:

        【解决方案3】:

        您正在使用 C 类型的习语,如果您使用 C++ 进行 google 文件处理会更好。如果您是 C 程序员,这开始有点奇怪,但绝对值得努力弄清楚如何以 C++ 的方式做事

        【讨论】:

          【解决方案4】:

          您需要添加一个空字节并删除新行,因此在您的第一个 for 循环中编写一个 for 循环来搜索换行符并将其替换为空字节。

          尽管其他人是对的,但您在优化尝试中被严重误导。

          并确保您释放了您的 malloc。您应该使用 STL 的另一个充分理由。

          【讨论】:

            【解决方案5】:

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

            我可以理解,这对您来说可能不够快,因此作为替代方案。我可以建议吗

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

            【讨论】:

              【解决方案6】:

              我和其他人在这里,这是过早的优化。

              我看不出fgets(tempfname[i], 20, fp); 是如何编译的,更不用说工作了,因为tempfname[i]string&amp;fgets 需要char*

              也许你想要

              typedef char file_name[20]; // way too short
              file_name tempfnames[NUM_INPUT_FILES];
              

              尽管我会在此处进行许多其他更改,但您可以在每次循环迭代时完全处理一个文件,并完全避免使用名称数组。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-11-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-06-12
                相关资源
                最近更新 更多