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;u
arquivo.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;
}