在 C 中将两个浮点文件合并为一个文件

标签 c arrays

我的任务是读取两个都包含 float 的文件。然后我必须将它们按升序放入一个新文件中。代码如下:

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

int numLines(const char * fileName){
    FILE *file=fopen(fileName,"r");
    int lines=0;
    char c;
    while((c=fgetc(file))!=EOF){
        if(c==10){
            lines++;
        }
    }
    fclose(file);
    return lines;
}

float *  fileToArray(const char * fileName){
    FILE *file=fopen(fileName,"r");
    int numOfLines= numLines(fileName);
    float * arr= (float*)malloc(numOfLines*sizeof(float));
    int i;
    for(i=0;i<numOfLines;i++){
        fscanf(file,"%f\n",&arr[i]);
    }
    fclose(file);
    return arr; 
}

int cmpfunc(const void *a, const void *b){
    float fa= *(const float*) a;
    float fb= *(const float*) b;
    return (fa>fb)-(fa<fb);
}

int isSorted(FILE *fp){
    float prev;
    float o;
    do{
        fscanf(fp,"%f\n",&prev);
        fscanf(fp,"%f\n",&o);
        if(prev>o){
            fclose(fp);
            return 1;
        }
    }while(fscanf(fp,"%f\n",&o)==1);
    fclose(fp);
    return 0;
}

int main(int argc, const char * argv[]){
    const char *fileName1;
    const char *fileName2;
    const char *fileOut;
    FILE *fp1;
    FILE *fp2;
    FILE *fp3;
    float *arr1;
    float *arr2;
    int size1;
    int size2;

    if(argc!=4){
        printf("Usage: fileSort.exe FILENAME1 FILENAME2 FILEOUT");
        return 0;
    }
    else{
        fileName1= argv[1];
        fileName2= argv[2];
        fileOut= argv[3];
        fp1= fopen(fileName1,"r");
        fp2= fopen(fileName2, "r");
        fp3= fopen(fileOut, "w");
        if(fp1!=NULL && fp2!=NULL){
            arr1=fileToArray(fileName1);
            arr2=fileToArray(fileName2);
            size1=sizeof(arr1)/sizeof(float);
            size2=sizeof(arr2)/sizeof(float);
            if(!isSorted(fp1) || !isSorted(fp2)){
                printf("The files are not sorted in increasing order. Please sort them.");
            }
            else{
                float * arr3= malloc((size1+size2)*sizeof(float));
                int k;
                memcpy(arr3,arr1,size1*sizeof(float));
                memcpy(arr3+size1,arr2,size2*sizeof(float));
                qsort(arr3,size1+size2,sizeof(float),cmpfunc);
                for(k=0;k<(size1+size2);k++){
                    fprintf(fp3,"%f\n",arr3[k]);
                }
            }
            fclose(fp1);
            fclose(fp2);
            fclose(fp3);
        }
        else{
            printf("Files could not be opened\n");
        }
        return EXIT_SUCCESS;
    }

用于测试此代码的两个示例文件是:

数据1.txt: 0.586399 0.769484 0.864755 6.229683

数据2.txt: 0.279828 0.309235 0.591884 0.962811 1.361349 10.203892 12.158343

结果应该是它们的有序组合。但是,我得到的结果是: 0.279828 0.309235 0.586399 0.769484

无论我进行什么更改,它总是将四个数字写入结果文件中。辅助函数似乎很好地完成了它们的工作。当我尝试创建第三个数组并填充它时(或者至少我认为这是源),问题似乎出现了。我不知道这个问题是从哪里来的。我真的很感激在这个问题上的一些帮助。

最佳答案

变量arr1不是一个数组,它是一个指向浮点型的指针,即使您将其用作指向数组中第一个浮点元素的指针。

这意味着 sizeof 将返回指针的大小,该大小为 4 字节或 8 字节,具体取决于您是 32 位还是 64 位编译器。

解决此问题的一种方法是取消行数的计算,如下所示:

int size1 = numLines(fileName1);
int size2 = numLines(fileName2);
arr1=fileToArray(fileName1, size1);
arr2=fileToArray(fileName2, size2);

关于在 C 中将两个浮点文件合并为一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42600783/

相关文章:

c - 如何使用 fscanf 从数据之间带有分隔符的文件中获取空间

Ms-Dos 的 C99 编译器?

c - ARM 处理器中的数据存储方式

c - 如何使用变量作为宽度修饰符而不输出零

Javascript:根据包含字符串日期的子数组元素对数组进行排序

c - 从C中的字符串中获取子字符串

C - 矩阵 > 仅正元素

sql - 检查 Postgres 数组中是否存在值

ruby - 字符串无法写入 CSV 文件 Ruby

c - 从 char 数组中删除第一个单词并使用 C 中的指针将其打印出来