万万没想到视频下载:【求助】C程序--将文件中每一行字符反序(对最佳结果追加30分)

来源:百度文库 编辑:中科新闻网 时间:2024/05/05 17:43:51
请朋友帮帮忙 用标准C写下 谢谢!

【问题描述】
对于一个文本文件text1.dat,编写一个程序,将该文件中的每一行字符颠倒顺序后输出到另一个文件text2.dat中。

【输入文件】

输入文件为当前目录下的text1.dat,该文件含有多行任意字符,也可能有空行。每个文本行最长不超过80个字符。
【输出文件】
输出文件为当前目录下的text2.dat。

【样例输入】

设输入文件text1.dat为:

This is a test!
Hello, world!

How are you?

【样例输出】

输出文件text2.dat为:

!tset a si sihT
!dlrow ,olleH

?uoy era woH

【评分标准】
输出文件应与输入文件的字符个数相等,并且符合题目规定的格式。如果你的程序输出正确得20分,每个测试点4分。提交程序名为c0804.c。

#include <stdio.h>

void write_line(FILE *w,char stack[], int sp)
{
while(sp>0)
{
char c=stack[--sp];

if(c>=0)//ASCII字符
{
fprintf(w,"%c",c);
}
else//双字节字符的两个字节不能颠倒
{
fprintf(w,"%c%c",stack[--sp],c);
}
}
}

int main(int argc, char* argv[])
{
FILE *r=fopen("C:\\text1.dat","r");//输入文件
FILE *w=fopen("C:\\text2.dat","w");//输出文件

int eof;//用于指示是否已经到达文件末尾
char c;//读入的字符
char stack[20000];//堆栈,用于存放一行中的字符,一行最大允许20000个字节
int sp=0;//堆栈栈顶指针

for(eof=fscanf(r,"%c",&c);eof!=EOF && eof>0; eof=fscanf(r,"%c",&c))
{
if(c!='\n' && c!='\r')//将非换行符压入堆栈
{
stack[sp++]=c;
}
else//以逆序输出当前行的字符
{
write_line(w,stack,sp);

sp=0;//将堆栈清空

fprintf(w,"%c",c);//输出换行符
}
}
//以逆序输出最后一行的字符
write_line(w,stack,sp);

//关闭打开的文件
fclose(w);
fclose(r);

printf("转换完毕!\n");
return 0;
}