0

現在、CI/O と連携しようとしています。整数のみを保持するファイルがあり、1行に1つしかありません..カンマなどではありません.それらを読み取る最良の方法は何ですか:

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

私は正常に動作している2つのファイルを作成しています..しかし、最終的には、両方を読み込んで1つのコレクションに結合し、並べ替えてから、新しいファイルに出力したいと考えています。あなたが私のためにすべてを行う必要はありませんが、上記を手伝ってください.. これまでの私の努力は次のとおりです。

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));

編集:ファイル内のエントリ数を取得する方法:他の方法で追跡しない場合(たとえば、アイテムの数を最初の行にするなど)、唯一の解決策はファイルを2回読み取ることです。1回は行数をカウントし、もう1回は実際の数を読み取ります。カウントを使用するfseekrewind、カウントした後、読み取りポインタをファイルの先頭に「巻き戻し」ます。

私は個人的にカウントを別の関数に入れ、実際の読み取りも行います。このようにして、複数のファイルから読み取る場合にコードを複製する必要はありません。

于 2012-07-18T08:50:03.727 に答える
1

問題は、2 つのファイルの読み取り、データの並べ替え、および出力のファイルへの書き込みという 3 つの異なる部分に分けることができます。ここでは、2 つの入力ファイルがまだソートされていないと想定しています。もしそうなら、問題は大幅に単純化されます(その場合はマージソートをGoogleで検索してください)。

読み取り用にファイルを開きたい場合は、 as file open mode フラグ"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 に答える