2016-07-03 9 views
2

ファイルを処理しようとしています。私は* .txtファイルを管理する必要があります、私はキーワードを使用して特定の行を検索し、この行のいくつかのフィールドを編集する必要があります。* .txtファイルの1行の検索と更新 - C言語

MyFile.txtをが含まれています名私のキーワードであり、私はポイント、勝利、損失やネクタイを編集する必要があります。

名前のポイントは、損失が

Mark 4 1 0 1 
Kevin 6 2 1 0 
Phill 10 3 0 1 
Tony 13 4 1 1 
Dan 12 3 2 3 
-END- 

ネクタイ勝利します。

void Update (int Result, char User[15]) 
{ 
    struct Giocatore Player; 
    int temp; 
    FILE *fp; 


    fp=fopen("MyFile.txt","r+"); 
    if(fp==NULL) 
     { 
      printf("ERROR."); 
     } 
    else 
     { 
      //reading first line of txt 
      fscanf(fp,"%s %d %d %d %d",Player.Name,&Player.pts,&Player.wins,&Player.loss,&Player.tie); 
      do 
       { 
        if(strcmp(Player.Name, User)==0) //finding the username got from main. 
         { 
          if(Result==1) //win root 
           { 
            Player.Wins++; 
            Player.pts=(Player.wins*3)+Player.tie; 
            fprintf(fp,"%s %d %d %d %d",Player.Name,Player.pts,Player.wins,Player.loss,Player.tie); 
           } 
          else if(Result==0) //Tie root 
           { 
            Player.tie++; 
            Player.pts=(Player.wins*3)+Player.tie; 
            fprintf(fp,"%s %d %d %d %d",Player.Name,Player.pts,Player.wins,Player.loss,Player.tie); 
           } 
          else if(Result==2) //loss root 
           { 
            Player.loss++; 
            fprintf(fp,"%s %d %d %d %d",Player.Name,Player.pts,Player.wins,Player.loss,Player.tie); 
           } 
         } 
        fscanf(fp,"%s %d %d %d %d",Player.Name,&Player.pts,&Player.wins,&Player.loss,&Player.tie); 

        temp=strcmp(Player.Name,"-END-"); 

        } /* end while*/ 
       while(temp!=0); 
      fclose(fp); 
     } 

} 

私はこのコードを使用していますが、動作しません。ユーザー名は見つかりますが、更新できません。あなたは行番号を保存し、新しい内容でファイルのコピーを書くために行番号を使用することができます

+2

はすべてを読んで(ケビンのスコアが更新されました)プログラムの実行後のoutput.txtファイル] - > [更新] - > [すべての – BLUEPIXY

+0

があることを考慮すると、書き込み行のサイズが変わることがあります(数字の数字が2つ以上に増える可能性があると仮定します)。あなたが望むことを行う唯一の方法は、解析中にファイル全体をメモリにロードしてから、全体の内容を書き換えることです。 – Carlo

+0

私はstructレコードにロードしているのが分かるように、各フィールドには次のスペースとスペースがあり、検索と印刷に使用されます。 –

答えて

0

を支援するための

感謝。

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

struct Giocatore { 
    char Name[15]; 
    int pts; 
    int wins; 
    int loss; 
    int tie; 
    int Wins; 
}; 

int replaceline(int lineNum, char *replacement) { 
    FILE *fp, *fc; 

    int count = 0; //count number lines in source file. 
    int ch; //temporary place to store character of source file(one at a time). 
    int edited = 0; //0=false and 1=true 
    char *t; //temporary place to store input which you want to be replaced with error in text file. 


    fp = fopen("MyFile.txt", "r"); 
    fc = fopen("output.txt", "w"); 

    if (fp == NULL || fc == NULL) { 
     printf("\nError...cannot open/create files"); 
     return 1; 
    } 


    while ((ch = fgetc(fp)) != EOF) { 
     if (ch == '\n') 
      count++; 
     if (count == lineNum - 1 && edited == 0) { 


      if (count == 0) 
       fprintf(fc, "%s\n", replacement); 
      else 
       fprintf(fc, "\n%s\n", replacement); 

      edited = 1; 

      while ((ch = fgetc(fp)) != EOF) { 
       if (ch == '\n') 
        break; 
      } 
     } 
     else 
      fprintf(fc, "%c", ch); 
    } 
    fclose(fp); 
    fclose(fc); 

    if (edited == 1) 
     printf("\nCongrates...Error Edited Successfully."); 
    else 
     printf("\nLine Not Found"); 

    return 0; 
} 


void Update(int Result, char User[15]) { 
    struct Giocatore Player; 
    int temp; 
    FILE *fp; 
    int line = 0; 
    char ch[15]; 
    fp = fopen("MyFile.txt", "r+"); 
    if (fp == NULL) { 
     printf("ERROR."); 
    } 
    else { 
     //reading first line of txt 
     fscanf(fp, "%s %d %d %d %d", Player.Name, &Player.pts, &Player.wins, &Player.loss, &Player.tie); 
     do { 
      line++; 
      printf("Player name %s ", Player.Name); 
      if (strcmp(Player.Name, User) == 0) { 
       if (Result == 1) { 
        Player.wins++; 
        Player.pts = (Player.wins * 3) + Player.tie; 

        sprintf(ch, "%s %d %d %d %d", Player.Name, Player.pts, Player.wins, Player.loss, Player.tie); 
        printf("%s\n", ch); 
        break; 


       } 
       else if (Result == 0) //Tie root 
       { 
        Player.tie++; 
        Player.pts = (Player.wins * 3) + Player.tie; 

       } 
       else if (Result == 2) //loss root 
       { 
        Player.loss++; 

       } 
      } 
      fscanf(fp, "%s %d %d %d %d", Player.Name, &Player.pts, &Player.wins, &Player.loss, &Player.tie); 

      temp = strcmp(Player.Name, "-END-"); 

     } /* end while*/ 
     while (temp != 0); 
     fclose(fp); 

     replaceline(line, ch); 
    } 

} 

int main(void) { 
    Update(1, "Kevin"); 
    return 0; 
} 

ファイルは

Mark 4 1 0 1 
Kevin 6 2 1 0 
Phill 10 3 0 1 
Tony 13 4 1 1 
Dan 12 3 2 3 
-END- 

をMYFILE.TXT

Mark 4 1 0 1 
Kevin 9 3 1 0 
Phill 10 3 0 1 
Tony 13 4 1 1 
Dan 12 3 2 3 
-END- 
関連する問題