0

目前正在尝试使用 CI/O。我有一个只包含整数的文件,每行只有一个.. 不是逗号等.. 读取它们的最佳方法是什么:

//WHILE NOT EOF
    // Read a number
    // Add to collection

我正在创建 2 个工作正常的文件。但最终,我想将它们都读入,将它们加入一个集合中,对它们进行排序,然后将它们打印到一个新文件中。你不需要为我做所有这些,但请帮助解决上述问题..这是我到目前为止的努力:

void simpleCopyInputToOutput(void);
void getSortSave(void);

int main()
{
    //simpleCopyInputToOutput();
    getSortSave();

    system("PAUSE");
    return 0;
}

void getSortSave(void)
{
    FILE *fp1;
    FILE *fp2;
    FILE *fpMerged;

    printf("Welcome. You need to input 2 sets of numbers.\n");
    printf("Please input the first sequence. Press 0 to stop.\n");

    if ((fp1 = fopen("C:\\seq1.txt", "w")) == NULL)
    {
        printf("Cannot open or create first file!\n");
        exit(1);
    }

    int num;
    int i = 1;
    while (num != 0)
    {
        printf("Please input value # %d\n", i);
        scanf("%d", &num);

        if (num == 0)
        {
            break;
        }

        fprintf(fp1, "%d\n", num);
        i++;
    }

    printf("Please input the second sequence. Press 0 to stop.\n");
    if ((fp2 = fopen("C:\\seq2.txt", "w")) == NULL)
    {
        printf("Cannot open or create second file!\n");
        exit(1);
    }

    num = -1;
    i = 1;
    while (num != 0)
    {
        printf("Please input value # %d\n", i);
        scanf("%d", &num);

        if (num == 0)
        {
            break;
        }

        fprintf(fp2, "%d\n", num);
        i++;
    }

    fclose(fp1);
    fclose(fp2);

    if ((fp1 = fopen("C:\\seq1.txt", "r")) == NULL)
    {
        printf("Cannot open first file!\n");
        exit(1);
    }

    //WHILE NOT EOF
    // Read a number
    // Add to collection

    //TODO: merge ints from both files, sort and output to new file
}
4

2 回答 2

1

我建议你使用fgets

char buffer[16];
while (fgets(buffer, sizeof(buffer), fp1))
{
    long value = strtol(buffer, NULL, 10);

    /* Use the value... */
}

/* fgets failed ro read, check why */
if (!feof(fp1))
    printf("Error: %s\n", strerror(errno));

编辑:如何获取文件中的条目数:如果您不以任何其他方式跟踪它(例如,将项目数作为第一行),唯一的解决方案可能是读取文件两次。一次计算行数,一次读取实际数字。在计数之后使用fseekrewind将读取指针“倒回”到文件的开头。

我个人会把计数放在一个单独的函数中,还有实际的读数。这样,如果您想从多个文件中读取,您就不必重复代码。

于 2012-07-18T08:50:03.727 回答
1

您的问题可以分为三个不同的部分:读取两个文件、对数据进行排序以及将输出写入文件。我在这里假设两个输入文件尚未排序。如果是这样,问题将大大简化(如果是这种情况,请使用 Google 搜索)。

如果要打开文件进行读取,则必须使用"r"而不是"w"作为文件打开模式标志。在您的示例代码中,读/写部分以某种方式与您上面描述的内容相反。然后您应该使用 fscanf 从 FILE* 读取格式化输入。scanf(...)只是fscanf(stdin, ...). 您可以通过以下方式访问文件:

FILE *fin1 = fopen("seq1.txt", "r");
FILE *fin2 = fopen("seq2.txt", "r");
FILE *fout = fopen("out.txt", "w");

if (fin1 && fin2 && fout) {
    // Do whatever needs to be done with the files.
}
if (fout)
    fclose(fout);
if (fin2)
    fclose(fin2);
if (fin1)
    fclose(fin1);

使用动态内存来存储整数是很困难的。realloc当您向其中写入越来越多的数据时,您需要使用来增加缓冲区,最后用于qsort对数据进行排序。如果需要,其他人可以希望能提供更多的洞察力。

于 2012-07-18T09:15:48.150 回答