【问题标题】:To malloc or not to malloc, that is the question!malloc 还是不 malloc,这是个问题!
【发布时间】:2010-03-05 19:06:33
【问题描述】:

创建要写入的文件时是否需要 malloc?

该文件将基于其他 2 个文件的内容,所以我需要为 sizeof( file a ) + sizeof( file b) + 1 的可写文件分配空间吗?

对不起,如果这没有意义;如果不是,那么我想我需要多读一些:D

基本上,我有 2 个 txt 文件和一个字符串序列 - 我将每个文件的每一行并排写入,由字符串序列分隔。

txt file a

hello stack over 
flow this 
is a test

txt file b

jump the
gun i am
a novice

seperator == xx

output ==

hello stack overxxjump the
flow thisxxgun i am
is a testxxa novice

【问题讨论】:

  • 文本文件还是二进制文件?您要合并 2 个文件吗?
  • 你必须更好地说明你的目的。处理文件不一定涉及使用“malloc”,因此它取决于您的实际用例/目的。
  • 基本上,我有 2 个 txt 文件和一个字符串序列 - 我正在并排写入每个文件的每一行,并由字符串序列分隔
  • 我会温和地建议你在K&R中看一些这样的材料,这样会清楚得多。 (提示:从头开始,一直到此为止)

标签: c file file-io malloc


【解决方案1】:

如果你是按顺序写的,你不能在需要写出东西的时候使用fprintf()fwrite(),而不是一次写整个文件吗?

编辑:根据您的更新,这基本上是您必须做的(可能不是有效的 C,因为我不是 C 程序员):

EDIT2:在 msw 的帮助下:

const int BUFSIZE = 200;
FILE *firstFile = fopen("file1.txt", "r");
FILE *secondFile = fopen("file2.txt", "r");
FILE *outputFile = fopen("output.txt", "w");
char* seperator = "xx";
char firstLine[BUFSIZE], secondLine[BUFSIZE];

// start a loop here
fgets(firstLine, 200, firstFile);
fgets(secondLine, 200, secondFile);
// Remove '\n's from each line

fprintf(outputFile, "%s%s%s", firstLine, seperator, secondLine);
// end a loop here

fclose(outputFile);
fclose(firstFile);
fclose(secondFile);

【讨论】:

  • 我认为输入我们实际传递的内容而不是数字会更清楚(因为这样更清楚的是,第三个参数是要读取的每个内容的大小)。
  • BUFSIZ 用于未知长度的char[] 是惯用的。我还会使用fgets(char * buf, int size, FILE *f),因为它在换行符处停止(需要将其切断)。我知道你不是 C 程序员,所以这是情有可原的 ;)
  • 啊,我只是删除了该部分,因为我不知道该怎么做。我现在就修。
  • 有两个注意事项: 1. fgets 也读取换行符。因此,在打印 "%s%s%s" 时,您不会将所有内容都放在同一行中。 2.实际上你还需要一个循环来将最长文件的剩余部分复制到输出文件中
  • 谢谢,我只用单行文件测试过。
【解决方案2】:

如果您需要将整个文件保存在内存中,您只需要 malloc 整个文件大小(即使那样,您也可以使用 mmap 或其他东西)。为您打算在内存中使用的数据分配尽可能多的内存:不多也不少。

【讨论】:

    【解决方案3】:

    文件在磁盘上,malloc 用于 RAM。

    只有在写入文件之前需要内存空间来存储数据时,您才需要 malloc,否则,通常您会使用堆栈分配的 8k 缓冲区以块的形式写入文件。

    因此,按原样处理您的问题,不,您很少 malloc 只是为了写入文件。

    如果您的目标是将文件完整地保存在内存中,那么您将 malloc sizeof 文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-13
      • 2012-04-16
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多