2013-04-03 4 views
1

Я изучаю C для предстоящего теста, и я борюсь с этим.Редактировать содержимое для текстового файла в C

Работа редактировать текстовый файл с этим правилом:

  • Там нет места Befor,. ! :; ?
  • Существует только одно место после,. ! :; ?
  • Первое письмо после. ! ? муза прописные

main.cpp

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

int main() 
{ 
int i=0,size; 
char ch,source_file[100],*buffer; 
FILE *source, *target; 

printf("Enter name of file to copy\n"); 
gets(source_file); 

source = fopen(source_file, "r"); 

if(!source) 
{ 
    printf("File does not exist !"); 
    exit(EXIT_FAILURE); 
} 

target = fopen("test1.txt", "w"); 

/* 
    Edit for rule number 2 and 3 
*/ 
while((ch = fgetc(source)) != EOF) { 
    if(i!=0) { 
     if(ch == ' ') { 
      if(i== 1) { 
        fputc(ch,target); 
        i=2; 
      } 
      else if(i==2) { 
        continue; 
      } 
     } 
     else { 
      if(isalpha(ch)) { 
       ch= toupper(ch);  
      } 
      fputc(ch,target); 
      i=0; 
     } 
    } 
    else { 
     fputc(ch,target); 
     if(ch==',' || ch=='.' || ch=='!' || ch==':' || ch==';' || ch=='?'){ 
      i=1; 
     } 
     else { 
      i=0; 
     } 
    } 
} 

/** 
* Reverse and put text content into an array. 
* Then read array bottom up,put in source file 
* for requiment number 1 : 
*/ 
fseek(target, 0, SEEK_END); 
size = ftell(target); 

buffer = (char *) malloc (size+1); 
target= freopen("test1.txt","r",target); 
for (i=(size-1); i>=0; i--) 
{ 
    buffer[i] = fgetc(target); 
} 
buffer[size] = 0; 

source =freopen(source_file,"w",source); 
int state=0; 
for(int k=(size-1);k>=0;k--) { 
    if(buffer[k]== EOF) { 
     continue; 
    } 
    if(state== 1) { 
     if(buffer[k]== ' ') { 
      continue; 
     } 
     else { 
      fputc(buffer[k],source); 
      state= 0; 
     }  
    } 
    else { 
     if(buffer[k]== ',' || buffer[k]== '.' || buffer[k]== '!' || buffer[k]== ':' || buffer[k]== ';' || buffer[k]== '?') { 
      state= 1; 
     } 
     fputc(buffer[k],source); 
    } 
} 
printf("File copied successfully.\n"); 

    /** 
    * Close all file 
    */ 
fclose(source); 
fclose(target); 
if(remove("test1.txt")== 0) { 
    printf("\nDelete successfully"); 
} 
else { 
    printf("\n Error"); 
} 
return 0; 
    } 

я сделал решить правило номер 2 и 3.

Но с 1-го правила, результат не так как я ожидал на моем code.After конвертировать для правил 2 и 3, я меняю содержимое, а затем редактирую его, а затем снова создаю и помещаю в исходный_файл.

Я установил состояние, 1 означает, что предыдущий символ,. ! :; ?, 0 - нормальный символ В результате все пространство после,. ! :; ? is delete, но пространство перед,. ! :; ? все еще существует.

Где неправильно в моем коде, пожалуйста, помогите мне, извините за длинный пост :(

EDIT (работал).

/* Rules: 
    ** NO space before punctuation. 
    ** only ONE space after punctuation 
    ** after a .?! the next alpha character should be Capitalised 
    */ 

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

    #define STATE_INITIAL 0 
    #define STATE_WORD 1 
    #define STATE_KOMMA 2 
    #define STATE_PERIOD 3 
    #define STATE_EOF -1 

    int main(void) 
    { 
unsigned spacecount; 
int i=0,state; 
char ch,source_file[100]; 
FILE *source, *target; 

    spacecount= 0; 

printf("Enter name of file to copy\n"); 
gets(source_file); 

source = fopen(source_file, "r"); 

if(!source) 
{ 
    printf("File does not exist !"); 
    exit(EXIT_FAILURE); 
} 

target = fopen("test1.txt", "w"); 

for (state=STATE_INITIAL; state != STATE_EOF;) { 
    ch = fgetc(source); 
    switch(ch) { 
    case ':' : case ',' : case ';' : 
      spacecount=0; 
      state = STATE_KOMMA; 
      break; 
    case '!' : case '.' : case '?' : 
      spacecount=0; 
      state = STATE_PERIOD; 
      break; 
    case ' ': spacecount++; continue; 
    case EOF: state = STATE_EOF; continue; 
    default: 
      if (state == STATE_KOMMA || state == STATE_PERIOD) spacecount = 1; 
      for(;spacecount > 0; spacecount--) { fputc(' ',target); } 
      if (state == 3 && isalpha(ch)) ch = toupper(ch); 
      state = STATE_WORD; 
      break; 
      } 
    fputc(ch,target); 
    } 

    return 0; 
    } 
+2

ли condidered вы, как конечный автомат? (требуется только для подсчета пробелов) – wildplasser

+0

Как насчет проверки следующего символа:.!? когда текущий символ пустой и только записывает второй символ, если true, и записывает оба, если false? –

+0

Предложение: сломайте свою программу в меньших группах инструкций (функций). – pmg

ответ

3

Минималистичный состояние машины Пожалуйста, обратите внимание, что нет никакой необходимости для буферизации предыдущих символов, только вспомнив их (с помощью state и spacecount)

/* Rules: 
** NO space before punctuation. 
** only ONE space after punctuation 
** after a .?! the next alpha character should be Capitalised 
*/ 

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

#define STATE_INITIAL 0 
#define STATE_WORD 1 
#define STATE_KOMMA 2 
#define STATE_PERIOD 3 
#define STATE_EOF -1 

int main(void) 
{ 
unsigned spacecount; 
int state,ch; 

spacecount=0; 
for (state=STATE_INITIAL; state > STATE_EOF;) { 
     ch = getc(stdin); 
     switch(ch) { 
     case ':' : case ',' : case ';' : 
       spacecount=0; 
       state = STATE_KOMMA; 
       break; 
     case '!' : case '.' : case '?' : 
       spacecount=0; 
       state = STATE_PERIOD; 
       break; 
     case ' ': spacecount++; continue; 
     case EOF: state = STATE_EOF; continue; 
     default: 
       if (state == STATE_KOMMA || state == STATE_PERIOD) spacecount = 1; 
       for(;spacecount > 0; spacecount--) { putc(' ', stdout); } 
       if (state == 3 && isalpha(ch)) ch = toupper(ch); 
       state = STATE_WORD; 
       break; 
       } 
     putc(ch, stdout); 
     } 

return 0; 
} 
+0

Я редактировал ваш код, но есть какая-то проблема, программа продолжает работать, и файл не копируется. Pls посмотрел и помог мне :( –

Смежные вопросы