Как исправить петлю fprintf? - PullRequest
0 голосов
/ 14 июня 2019

У меня есть файл .txt, записанный так:

PersonName colour1 colour2 colour3

, например:

Nick blue green black
Lisa orange yellow green
Mark white blue orange

моя программа: editColour (fileName, colourInTheFile, colourIWant) должна изменитьcolourInTheFile с colourIWant и возвращает количество раз, когда он это сделал.Проблема в том, что он запускает цикл

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

typedef char String[100];

int editColour(String fileName,String current_colour,String new_colour){

    String name,c1,c2,c3;

    int num_s = 0; /*number of occurence*/

    FILE *fp = fopen(fileName,"r");
    /*this is just a test, so i'm tryng to put the fileName content in this one*/
    FILE *ftemp = fopen("/Users/valerio/Desktop/PROGRAMMI/C/Lezione12_esercizio1/Lezione12_esercizio1/file.txt","w+");
    long pos;

    while(!feof(fp)){


        pos = ftell(fp);
        fscanf(fp, "%s %s %s %s\n",name,c1,c2,c3);


        if(strcmp(c1, current_colour)==0){

            fseek(fp,pos,SEEK_SET);
            fprintf(ftemp, "%s %s %s %s\n",name,new_colour,c2,c3);
            num_s++;

        }
        if(strcmp(c2, current_colour)==0){

            fseek(fp,pos,SEEK_SET);
            fprintf(ftemp, "%s %s %s %s\n",name,c1,new_colour,c3);
            num_s++;

        }
        if(strcmp(c3, current_colour)==0){

            fseek(fp,pos,SEEK_SET);
            fprintf(ftemp, "%s %s %s %s\n",name,c1,c2,new_colour);
            num_s++;

        }

        fprintf(ftemp, "%s %s %s %s\n",name,c1,c2,c3);

    }

    fclose(fp);
    fclose(ftemp);
    return num_s;

}

int main(int argc, const char * argv[]) {

    printf("%d\n\n", editColour("/Users/valerio/Desktop/PROGRAMMI/C/Lezione12_esercizio1/Lezione12_esercizio1/social_users copia.txt",
                                    "orange", "poop"));

}

ожидаемый:

       Nick blue green black
       Lisa poop yellow green
       Mark white blue poop (in the new file)

фактический:

     Nick blue green black
     Lisa poop yellow green
     Lisa orange yellow green
     Lisa poop yellow green
     Lisa orange yellow green
     Lisa poop yellow green
     Lisa orange yellow green
     Lisa poop yellow green
     Lisa orange yellow green
      .
      .  
      .

в цикле

1 Ответ

0 голосов
/ 14 июня 2019

следующий предложенный код:

  1. чисто компилирует
  2. выполняет желаемую функциональность
  3. правильно проверяет наличие ошибок
  4. избегает неверного утверждения: while( !feof(fp) )

А теперь предложенный код:

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

#define MAX_CHAR 100

int editColour( char fileName[], char current_colour[], char new_colour[] )
{
    char name[ MAX_CHAR ];
    char c1[ MAX_CHAR ];
    char c2[ MAX_CHAR ];
    char c3[ MAX_CHAR ];

    int num_s = 0; /*number of occurence*/

    FILE *fp = fopen(fileName,"r");
    if( !fp )
    {
        perror( "fopen for input file failed" );
        exit( EXIT_FAILURE );
    }

    FILE *ftemp = fopen("/Users/valerio/Desktop/PROGRAMMI/C/Lezione12_esercizio1/Lezione12_esercizio1/file.txt","w");
    if( !ftemp )
    {
        perror( "fopen for output file failed" );
        fclose( fp );
        exit( EXIT_FAILURE );
    }

    while( fscanf( fp, "%99s %99s %99s %99s\n", name, c1, c2, c3 ) == 4 )
    {
        if( !strcmp( c1, current_colour ) )
        {
            fprintf( ftemp, "%s %s %s %s\n", name, new_colour, c2, c3 );
            num_s++;
        }

        if( !strcmp( c2, current_colour ) )
        {
            fprintf( ftemp, "%s %s %s %s\n", name, c1, new_colour, c3 );
            num_s++;
        }

        if( !strcmp( c3, current_colour ) )
        {
            fprintf( ftemp, "%s %s %s %s\n", name, c1, c2, new_colour );
            num_s++;
        }

        else
        {
            fprintf( ftemp, "%s %s %s %s\n", name, c1, c2, c3 );
        }

    }

    fclose(fp);
    fclose(ftemp);
    return num_s;
}


int main( void ) 
{
    printf("%d\n\n", 
        editColour("/Users/valerio/Desktop/PROGRAMMI/C/Lezione12_esercizio1/Lezione12_esercizio1/social_users copia.txt",
           "orange", "poop"));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...