在C中编辑文本文件的内容
我正在为即将到来的考试学习C语言,我正在努力解决这个问题 使用以下规则编辑文本文件:在C中编辑文本文件的内容,c,C,我正在为即将到来的考试学习C语言,我正在努力解决这个问题 使用以下规则编辑文本文件: 在…之前没有空格!: .!:;?之后只有一个空格 后面的第一个字母?muse应该是大写的 main.cpp #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> int main() { int i=0,size; char ch,source_file[1
- 在…之前没有空格!:李>
- .!:;?之后只有一个空格李>
- 后面的第一个字母?muse应该是大写的
#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;
}
#包括
#包括
#包括
#包括
int main()
{
int i=0,大小;
char ch,源文件[100],*缓冲区;
文件*源,*目标;
printf(“输入要复制的文件名\n”);
获取(源文件);
source=fopen(source_文件,“r”);
如果(!源)
{
printf(“文件不存在!”);
退出(退出失败);
}
target=fopen(“test1.txt”,“w”);
/*
编辑规则2和规则3
*/
而((ch=fgetc(源))!=EOF){
如果(i!=0){
如果(ch=''){
如果(i==1){
fputc(ch,target);
i=2;
}
else如果(i==2){
继续;
}
}
否则{
if(艾萨帕(ch)){
ch=toupper(ch);
}
fputc(ch,target);
i=0;
}
}
否则{
fputc(ch,target);
如果(ch=','| | ch='。| | ch='!'| | ch=':'| | ch=';'| | ch='?){
i=1;
}
否则{
i=0;
}
}
}
/**
*反转并将文本内容放入数组中。
*然后自下而上读取数组,放入源文件
*对于第1项要求:
*/
fseek(目标,0,搜索结束);
大小=ftell(目标);
缓冲区=(字符*)malloc(大小+1);
target=freopen(“test1.txt”,“r”,target);
对于(i=(大小-1);i>=0;i--)
{
缓冲区[i]=fgetc(目标);
}
缓冲区[大小]=0;
source=freopen(source_文件,“w”,source);
int state=0;
对于(int k=(size-1);k>=0;k--){
if(缓冲区[k]==EOF){
继续;
}
如果(状态==1){
如果(缓冲区[k]=''){
继续;
}
否则{
fputc(缓冲区[k],源);
状态=0;
}
}
否则{
如果(buffer[k]=','| buffer[k]='。| buffer[k]='!'| buffer[k]=':'| buffer[k]=';'| buffer[k]='?){
状态=1;
}
fputc(缓冲区[k],源);
}
}
printf(“文件复制成功。\n”);
/**
*关闭所有文件
*/
fclose(来源);
fclose(目标);
如果(删除(“test1.txt”)==0){
printf(“\n删除成功”);
}
否则{
printf(“\n错误”);
}
返回0;
}
我解决了第二条和第三条规则
但对于第1条规则,结果与我在代码中预期的不一样。在转换规则2和3后,我反转内容,然后编辑它,然后再次重新恢复并放入源文件
我设置了一个状态,1表示前面的字符是,.!:?,0是正常字符
结果是,.!:;?之后的所有空格?是删除,但在,.!:;?之前有空格?它仍然存在
我的代码哪里错了,请帮我解决,抱歉发了这么长的帖子:(
编辑(工作):
/*规则:
**标点前没有空格。
**标点符号后只有一个空格
**在.?!之后,下一个字母字符应大写
*/
#包括
#包括
#包括
#包括
#定义状态_初始值0
#定义状态_单词1
#定义状态2
#定义第3阶段的状态
#定义状态_EOF-1
内部主(空)
{
无符号空格计数;
int i=0,状态;
char ch,源_文件[100];
文件*源,*目标;
spacecount=0;
printf(“输入要复制的文件名\n”);
获取(源文件);
source=fopen(source_文件,“r”);
如果(!源)
{
printf(“文件不存在!”);
退出(退出失败);
}
target=fopen(“test1.txt”,“w”);
for(state=state\u INITIAL;state!=state\u EOF;){
ch=fgetc(来源);
开关(ch){
案例“:”:案例“,”:案例“;”:
spacecount=0;
state=state_KOMMA;
打破
案例“!”:案例“:”案例“?”:
spacecount=0;
状态=状态周期;
打破
案例“”:spacecount++;继续;
案例EOF:状态=状态EOF;继续;
违约:
如果(state==state|KOMMA | state==state_PERIOD)spacecount=1;
对于(;spacecount>0;spacecount--){fputc('',target);}
如果(state==3&&isalpha(ch))ch=toupper(ch);
state=state\u单词;
打破
}
fputc(ch,target);
}
返回0;
}
最低限度的状态机。请注意,不需要缓冲以前的字符,只需要记住它们(通过状态和空格计数)
/*规则:
**标点前没有空格。
**标点符号后只有一个空格
**在.?!之后,下一个字母字符应大写
*/
#包括
#包括
#包括
#定义状态_初始值0
#定义状态_单词1
#定义状态2
#定义第3阶段的状态
#定义状态_EOF-1
内部主(空)
{
无符号空格计数;
int状态,ch;
spacecount=0;
对于(state=state\u INITIAL;state>state\u EOF;){
ch=getc(标准偏差);
开关(ch){
案例“:”:案例“,”:案例“;”:
spacecount=0;
state=state_KOMMA;
打破
案例“!”:案例“:”案例“?”:
spacecount=0;
状态=状态周期;
打破
案例“”:spacecount++;继续;
案例EOF:状态=状态EOF;继续;
违约:
如果(state==state|KOMMA | state==state_PERIOD)spacecount=1;
对于(;spacecount>0;spacecount--){putc('',stdout);}
如果(state==3&&isalpha(ch))ch=toupper(ch);
state=state\u单词;
打破
}
putc(ch,stdout);
}
返回0;
}
您是否将其视为有限状态机?(您只需要计算空格数)检查下一个字符是否为,.:!?当当前字符为空时,仅写入第二个字符(如果为真,则写入两个字符)(如果为假)?建议:将程序分成较小的组
/* 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;
}
/* 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;
}