簡體   English   中英

C程序文件讀取,重新格式化,寫入

[英]C program file read, reformat, write

我在while循環中遇到麻煩,如何獲取字符串,並且僅將名稱major和GPA顯示為列表。 另外,我在fgets函數中需要幫助,因為每三行中的每一行都不同,所以我將如何在列表中顯示它們。 我將在while循環中放入什么來使它起作用?

#include <stdio.h>

int main(void)
{

    FILE *cfPtr;
    FILE *ofp;
    char name[20];
    char major[3];
    double gpa;
    ofp = fopen("outputFile.txt","w");
    fprintf(ofp,"Name\tMajor\tGPA\n");
    if((cfPtr = fopen("inputFile.txt","r")) == NULL)
    {
        printf("This file could not be opened\n");
    }
    else
    {
        while (!feof(cfPtr))
        {   

            fgets(name, 20, cfPtr );
            //How to read the string and only display
            //the name major and gpa?
            //fprintf(ofp,"%s\t%s\t%f\n", name, major, gpa);

        }

    }
    fclose(cfPtr);
    fclose(ofp);    
}

輸入文件為:

Name: John Milton
Major: EE
GPA: 3.98
Name: Karl Lewis
Major: CS
GPA: 3.6
Name: Homer Simpson
Major: CE
GPA: 4.0

我需要輸出文件為:

Name:           Major:  GPA:
John Milton     EE      3.98
Karl Lewis      CS      3.6
Homer Simpson   CE      4.0

嗨,您可以這樣操作。如果必須使用fegts。

您應該聲明這些char數組,

char name[20];//enough long
char major[10];//enough long
char gpa[10];//enough long
char name_tag[7];//According to the "Name: "
char major_tag[8];//According to the "Major: "
char gpa_tag[6];//According to the "GPA: "

而while循環,

while (1)
{   
    if(fgets(name_tag,7,cfPtr) == NULL)
        break;
    if (feof(cfPtr))
    {
         break;
    }
    if(fgets(name, 20, cfPtr ) == NULL)
        break;
    if (name[strlen(name) - 1] == '\n')
    {
        name[strlen(name) - 1] = '\0';//remove '\n'
    }
    if(fgets(major_tag,8,cfPtr) == NULL)
        break;
    if(fgets(major,10,cfPtr) == NULL)
        break;
    if (major[strlen(major) - 1] == '\n')
    {
        major[strlen(major) - 1] = '\0';
    }
    if(fgets(gpa_tag,6,cfPtr) == NULL)
        break;
    if(fgets(gpa,10,cfPtr) == NULL)
        break;
    if (gpa[strlen(gpa) - 1] == '\n')
    {
        gpa[strlen(gpa) - 1] = '\0';
    }

    fprintf(ofp,"%s\t%s\t%s\n", name, major, gpa);
}

示例代碼:

#include <stdio.h>

typedef struct data {
    char name[20];
    char major[3];
    double gpa;
} Data;

Data *fgets_data(Data *aData, FILE *fp){
    if( fscanf(fp, "Name: %19[^\n]%*c", aData->name)==1 &&
        fscanf(fp, "Major: %2s%*c", aData->major)==1 &&
        fscanf(fp, "GPA: %lf%*c", &(aData->gpa))==1 )
        return aData;

    return NULL;//fail
}

void fputs_data(Data *aData, FILE *fp){
    if(aData == NULL) //print caption
        fprintf(fp, "%-20s%-8s%s\n",
        "Name:", "Major:", "GPA:");
    else
        fprintf(fp, "%-20s%-8s%g\n",
            aData->name, aData->major, aData->gpa);
}

int main(void){
    FILE *cfPtr;
    Data aData;

    if((cfPtr = fopen("inputFile.txt","r")) == NULL){
        fprintf(stderr, "This file could not be opened\n");
    } else {
        FILE *ofp = fopen("outputFile.txt","w");

        fputs_data(NULL, ofp);//print fileld name
        while (fgets_data(&aData, cfPtr)!=NULL)
            fputs_data(&aData, ofp);
        fclose(ofp);
        fclose(cfPtr);
    }
    return 0;
}

我不會為您編寫代碼,但會幫助您某種程度地構建解決方案。

如果您查看輸入文件和預期的輸出格式,則可能如下所示:

open input and output files
while there are more lines in the input file
   name = readline(); major = readline(); gpa = readline();
   writeLine(name, major, gpa);
close files

現在,它只是一次找出每個步驟的代碼。

暫無
暫無

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

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