C 将一个文件拆分为多个文件
我稍后会编写这段代码来模拟外部排序,但我不知道我做错了什么。这是我的密码:C 将一个文件拆分为多个文件,c,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 f
#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;
}
“disco_0.txt”:
此文件不获取任何值,它是一个空白文件
“disco_1.txt”:
“disco_2.txt”:
我所期望的是:
- “disco_0.txt”应包含前3个元素(主文件大小/文件数量)
- “disco_1.txt”应该有另外3个元素
- “disco_2.txt”应该包含最后4个元素
(对葡萄牙语代码感到抱歉)。据我所知,您希望将主文件拆分为n的文件。 您可以使用带有fscanf的循环并将数据保存到缓冲区,在主循环中,当数据在最后一次迭代中到达时,增加捕获整数的循环的限制,如果TAMANHO_ARQUIVO/QTD_DISCOS之间有剩余的除法,则捕获整数的循环将更大,因此,最后一个循环将比其他循环保存更多的int fscanf函数允许您使用参数捕获整数、浮点数、字符等 使用fread将使任务更加复杂。 不要忘记,要将文件指针放在正确的位置,我们必须计算行的末尾 毫无疑问,一定有更实际的方法来做你想做的事。 我可以用pt br写任何问题
#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 x = 0;
int incpos=0;
char name[FILENAME_MAX];
int memoria_interna = (int) ceilf(TAMANHO_ARQUIVO/QTD_DISCOS);
char vet[256] ;
printf("memoria_interna:%d remainder:%d \n",memoria_interna,TAMANHO_ARQUIVO%QTD_DISCOS);
int remainder = TAMANHO_ARQUIVO%QTD_DISCOS;
arquivoPrincipal = fopen("arquivo.txt", "w+");
int isLastDisco = memoria_interna-1;
srand(time(NULL));
for (int i = 0; i < TAMANHO_ARQUIVO; ++i)
{
x = rand() % 10;
fprintf(arquivoPrincipal, "%d\n", x);
}
fseek(arquivoPrincipal, 0 , SEEK_SET);/*reseta para a posição zero*/
for (int i = 0; i < QTD_DISCOS; ++i)
{
FILE *arquivo;
int numOfIntsTosave;
int *pInts;
sprintf(name,"disco_%d.txt", i); // generating files names dynamically printf("%s\n", name);
memset(vet, 0, 256); // clearing vector
//qtd_int = fread(vet, sizeof(char), memoria_interna*2, 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)
arquivo = fopen(name, "w");
if (!arquivo)
{
printf("Error!\n");
exit(0);
}
if(i==QTD_DISCOS-1)/*If we are in the last iteration of the for loop, then if there is a remainder, we add to memoria_interna */
numOfIntsTosave = memoria_interna+remainder;/*remainder this can be zero*/
else
numOfIntsTosave = memoria_interna;
pInts = (int*)malloc(sizeof(int)*numOfIntsTosave);/*alloc buffer to int´s*/
if(pInts==NULL){
printf("error malloc\n");
exit(0);
}
for(int u=0;u<numOfIntsTosave;u++)
{
fscanf(arquivoPrincipal,"%d\n",&pInts[u]);/*le do arquivo principal*/
fprintf(arquivo, "%d\n", pInts[u]);/*salva no arquivo*/
incpos+=2;/* um int e um /n */
}
if(pInts)
free(pInts);/*free buffer of int´s*/
incpos+=2;/* um int e um /n */
//fwrite(vet, sizeof(char), qtd_int , arquivo);//printf("Error!\n");
fclose(arquivo);
/*seeking/seting the position (for the next loop)*/
fseek(arquivoPrincipal,incpos, SEEK_SET);
}
fclose(arquivoPrincipal);
return 0;
}
#定义TAMANHO_ARQUIVO 10//主文件大小
#定义QTD_DISCOS 3//要分割主文件的文件数
int main()
{
FILE*arquivoPrincipal;//主文件
int x=0;
int incpos=0;
字符名[FILENAME_MAX];
国际记忆=(国际)ceilf(塔曼霍/阿奎沃);
charvet[256];
printf(“内部记忆:%d剩余部分:%d\n”,内部记忆,塔曼霍舞厅%QTD\u迪斯科舞厅);
整数余数=塔曼霍·阿奎沃%QTD\U迪斯科舞厅;
arquivoPrincipal=fopen(“arquivo.txt”、“w+”);
int isLastDisco=国际记忆-1;
srand(时间(空));
对于(int i=0;i 对于(int u=0;uarquivo.txt
包含数字的文本表示形式,为什么要用fread()
将它们读入int
数组?应该使用fscanf()
来解析fie。在使用fseek()之前,还要先读取arquivoPrincipal
)
。所以没有什么可读的,因为打印完数字后,您就在文件的末尾。我不明白您为什么要使用fread()的返回值
作为要查找的位置。看起来您是从随机数字创建“主要存档”的。写入这些数字后,您应该考虑关闭或刷新文件。在尝试读取之前,您需要将其倒带。因为您正在写入文本,所以您应该读取文本;这意味着您应该使用fgets()
和sscanf()
-或者只要fscanf()
就可以了。在这个程序中,你在开始之前就知道有多少行。当你进行外部排序时,当你开始读取数据时,你不一定知道有多少行。你需要在以后适当地修改你的代码。
0
0
3
1
9
7
3
1
9
7
9
7
#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 x = 0;
int incpos=0;
char name[FILENAME_MAX];
int memoria_interna = (int) ceilf(TAMANHO_ARQUIVO/QTD_DISCOS);
char vet[256] ;
printf("memoria_interna:%d remainder:%d \n",memoria_interna,TAMANHO_ARQUIVO%QTD_DISCOS);
int remainder = TAMANHO_ARQUIVO%QTD_DISCOS;
arquivoPrincipal = fopen("arquivo.txt", "w+");
int isLastDisco = memoria_interna-1;
srand(time(NULL));
for (int i = 0; i < TAMANHO_ARQUIVO; ++i)
{
x = rand() % 10;
fprintf(arquivoPrincipal, "%d\n", x);
}
fseek(arquivoPrincipal, 0 , SEEK_SET);/*reseta para a posição zero*/
for (int i = 0; i < QTD_DISCOS; ++i)
{
FILE *arquivo;
int numOfIntsTosave;
int *pInts;
sprintf(name,"disco_%d.txt", i); // generating files names dynamically printf("%s\n", name);
memset(vet, 0, 256); // clearing vector
//qtd_int = fread(vet, sizeof(char), memoria_interna*2, 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)
arquivo = fopen(name, "w");
if (!arquivo)
{
printf("Error!\n");
exit(0);
}
if(i==QTD_DISCOS-1)/*If we are in the last iteration of the for loop, then if there is a remainder, we add to memoria_interna */
numOfIntsTosave = memoria_interna+remainder;/*remainder this can be zero*/
else
numOfIntsTosave = memoria_interna;
pInts = (int*)malloc(sizeof(int)*numOfIntsTosave);/*alloc buffer to int´s*/
if(pInts==NULL){
printf("error malloc\n");
exit(0);
}
for(int u=0;u<numOfIntsTosave;u++)
{
fscanf(arquivoPrincipal,"%d\n",&pInts[u]);/*le do arquivo principal*/
fprintf(arquivo, "%d\n", pInts[u]);/*salva no arquivo*/
incpos+=2;/* um int e um /n */
}
if(pInts)
free(pInts);/*free buffer of int´s*/
incpos+=2;/* um int e um /n */
//fwrite(vet, sizeof(char), qtd_int , arquivo);//printf("Error!\n");
fclose(arquivo);
/*seeking/seting the position (for the next loop)*/
fseek(arquivoPrincipal,incpos, SEEK_SET);
}
fclose(arquivoPrincipal);
return 0;
}