我正在使用此代码来模拟外部排序,但我不知道我做错了什么。这是我的代码:
#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
我的期望是:
(对不起葡萄牙代码)。
答案 0 :(得分:0)
根据我的理解,您想将主文件拆分为n个文件。 你可以做的是使用带有fscanf的循环并将数据保存到缓冲区,在主循环中,当它到达最后一次迭代时,增加捕获整数的循环的限制,如果有剩余的除法TAMANHO_ARQUIVO / QTD_DISCOS之间捕获int的循环将更大,因此最后一个循环将比其他循环保存更多的int。
fscanf函数允许您使用参数来捕获整数,浮点数,字符等。
使用fread会使任务变得更加复杂。 不要忘记,要将文件指针放在正确的位置,我们必须计算行尾。
毫无疑问,必须有更实际的方法来做你想要的事情。 我可以用pt-br写的任何问题。
{{1}}