簡體   English   中英

在C中使用兩個文件

[英]Working with two files in C

我正在讀取一個名為“ text.txt”的文件,該文件包含一系列數字,兩者之間有一個空格。 我想在一個名為“ text_nr.txt”的新文件中寫入“ text.txt”中的所有數字,但不要重復! 我的代碼在第二個while循環中無限循環運行,但是我不明白為什么。

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


int main()
{
    int n=0,m=0,nr;

    FILE *fp1;
    FILE *fp2;
    fp1 = fopen("text.txt","r");
    fp2 = fopen("text_nr.txt","a+");

    while(fscanf(fp1,"%d",&n) != EOF){
        nr=0;
        while(fscanf(fp2,"%d",&m) != EOF){
            printf("%d  %d ",m,n);
            if(n != m) continue;
            else{
                nr++;
                break;
            }
        }   
        if(nr == 0){
            fprintf(fp2,"%d ",n);
        }
    }

    fclose(fp1);
    fclose(fp2);

    return 0;      
}

您的內部循環將不會到達文件末尾,因為如果文件開始為空,則它將與您的搜索字符串不匹配。

您可以執行fscanf並檢查它是否為0 (找不到任何內容)或EOF (結束)。

類似功能fscanf()返回等各種值EOF (文件或錯誤的端部)或匹配符的數量, 01 ,...

無需停止測試一個值代碼,而是針對所有不需要的值進行測試。

// while(fscanf(fp1,"%d",&n) != EOF){
while(fscanf(fp1,"%d",&n) == 1){
    nr=0;
    // while(fscanf(fp2,"%d",&m) != EOF){
    while(fscanf(fp2,"%d",&m) == 1){

@威廉·珀塞爾很好地解釋了

在輸入中的某些時候,fscanf的格式不匹配,因此fscanf返回0,但不前進文件指針。 因此,它始終從同一位置讀取數據,並且每次返回0。

無限循環。

嘗試使用fseek函數在輸出文件中移動流指針。

 while(fscanf(fp1,"%d",&n) != EOF){

    fseek ( fp2, 0 , SEEK_SET );
    bool flag = false;

    while(fscanf_s(fp2,"%d",&m) != EOF){
        printf("%d  %d ",m,n);

        if(n == m) 
        {
            printf("%d = %d ", m, n);
            flag = true;


            break;
        }
    }   
    if(!flag)
    {
        fseek ( fp2, 0 , SEEK_END );
        fprintf(fp2,"%d ",n);
    }
}

編輯

另一種方法是將寫入的值存儲在數組中。 為此,您可以使用向量。

vector<int> vData;

while(fscanf(fp1,"%d",&n) != EOF){


    bool flag = false;

    for(int i = 0; i < vData.size(); i++)
    {
        if(vData[i] == n)
        {
            flag = true;
            break;
        }
    }

    if(!flag)
    {
        vData.push(n);
        fprintf(fp2,"%d ",n);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM