将一个文件拆分为多个文件

时间:2017-05-11 22:38:06

标签: c

我正在使用此代码来模拟外部排序,但我不知道我做错了什么。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <string.h>

#define TAMANHO_ARQUIVO 10 // main file size
#define QTD_DISCOS 3       // number of files to divide the main file

int main () {

    FILE *arquivoPrincipal;  // main file
    int qtd_int = 0;
    int x = 0;
    char name[FILENAME_MAX];
    int memoria_interna = (int) ceil(TAMANHO_ARQUIVO/QTD_DISCOS);
    int vet[memoria_interna];

    arquivoPrincipal = fopen("arquivo.txt", "w+");

    srand(time(NULL));
    for (int i = 0; i < TAMANHO_ARQUIVO; ++i) {
      x = rand() % 10;
      fprintf(arquivoPrincipal, "%d\n", x);
    }

    for (int i = 0; i < QTD_DISCOS; ++i) {
      FILE *arquivo;
      snprintf(name, sizeof(name), "disco_%d.txt", i); // generating files dynamically          printf("%s\n", name);
      memset(vet, 0, sizeof vet); // clearing vector

      qtd_int = fread(&vet, sizeof(int), memoria_interna, arquivoPrincipal); // reading main file to get number of items from 0 to memoria_interna (which is the size of the main file / the number of files to be divided)
       //seeking/seting the position (for the next loop)
       fseek(arquivoPrincipal, qtd_int, SEEK_SET);

      arquivo = fopen(name, "w+");
      if (!arquivo) {
        printf("Error!\n");
        exit(0);
      }


      fwrite(&vet, sizeof(int), memoria_interna , arquivo);
      fclose(arquivo);
    }

    return 0;
}

我的输出是: “arquivo.txt:

7
2
9
2
1
6
9
2
8
5

“disco_0.txt”: 这个文件没有值,它是一个空白文件。

“disco_1.txt”:

0
0
3
1
9
7

“disco_2.txt”:

3
1
9
7
9
7

我的期望是:

  • “disco_0.txt”应该有前3个元素(主文件大小/文件数量)
  • “disco_1.txt”应该有另外3个元素
  • “disco_2.txt”应该包含最后4个元素

(对不起葡萄牙代码)。

1 个答案:

答案 0 :(得分:0)

根据我的理解,您想将主文件拆分为n个文件。 你可以做的是使用带有fscanf的循环并将数据保存到缓冲区,在主循环中,当它到达最后一次迭代时,增加捕获整数的循环的限制,如果有剩余的除法TAMANHO_ARQUIVO / QTD_DISCOS之间捕获int的循环将更大,因此最后一个循环将比其他循环保存更多的int。

fscanf函数允许您使用参数来捕获整数,浮点数,字符等。

使用fread会使任务变得更加复杂。 不要忘记,要将文件指针放在正确的位置,我们必须计算行尾。

毫无疑问,必须有更实际的方法来做你想要的事情。 我可以用pt-br写的任何问题。

{{1}}