一、實驗目的及要求
(1)掌握C語言文件的基本操作,消除源C語言程序中的註釋,爲以後的編譯提供方便。
二、實驗設備(環境)及要求
PC機及vc6.0軟件及環境
三、實驗內容與步驟
(1)先輸入輸出文件名和輸入文件名,對輸入文件和輸出文件分別判斷其的可讀性和可寫性,如果輸入文件不可讀或輸出文件不可寫,則報錯;如果輸入輸出正常,則從程序中開始讀取字符進行相應的操作。
(2)首先第一個判斷是判斷讀取的字符是否爲”,如果是,再判斷是否歷經在‘’裏面了(c是否等於0),如果不在那裏面,則做標記,讓在””裏面的字符都正常寫入輸出文件。
(3)接着第一個判斷是判斷讀取的字符是否爲‘,如果是,再判斷是否歷經在““裏面了(p是否等於0),如果不在那裏面,則做標記,讓在’‘裏面的字符都正常寫入輸出文件。
(4)判斷是否出現單獨的*/,如果出現,則輸出error:*/error character,
判斷方法:當不在““或‘’裏面(即count=0)並且不再註釋裏面(即temp=0)時,判斷當前字符是否爲‘*’,如果是,則判斷下一個是否爲‘/‘,如果是則輸出error:*/error character,如果不是,則做一個標記(t=1),讓本次循環輸出當前字符和前一個字符。
(5)然後進行註釋的消除:噹噹前字符爲‘/’並且不在““或‘’中時,判斷下一個字符是否爲‘/’或‘*’,如果是‘/’,則做一個標記(flag=1),讓註釋不寫入輸出文件中,直到字符爲‘\n’時才恢復輸入(flag=0),如果是‘*’,則做標記(temp=1和flag=1),讓註釋不寫入輸出文件,直到字符爲‘*/’時才恢復輸入(flag=0 和 temp=0);
(6)每循環一次,往後讀一個字符,知道字符讀完;
(7)循環結束後判斷,是否還在/*的註釋中(temp是否爲1),如果temp=1,則說明/*的註釋沒有結尾的*/。輸出錯誤,打印出“error:/*error “;
(8)最後,關閉輸入和輸出文件。
四、實驗結果與數據處理
所有功能一次性測試。
輸入文件:input.cpp
控制檯錯誤提醒:。
輸出文件:
五、代碼清單
#include"stdio.h"
#include"stdlib.h"
main()
{
FILE *fp1,*fp2;
char ch1,ch3,ifile[100],ofile[100];
int t,temp,count,flag,c,p;
printf("請輸入輸入文件名:");
scanf("%s",ifile);
printf("請輸入輸出文件名:");
scanf("%s",ofile);
if((fp1=fopen(ifile,"r"))==NULL) // input.cpp爲任意帶註釋的C程序
{
printf("file cannot be opened\n");
exit(1);
}
if((fp2=fopen(ofile,"w"))==NULL) // ouput.cpp爲去掉註釋後的程序
{
printf("file cannot be writed\n");
exit(1);
}
ch1=fgetc(fp1);
flag = 0;
count = 0;
temp = 0;
c=0;
p=0;
while(!feof(fp1))
{
t=0;
ch3 = ch1;
if(ch3 == '"' && c == 0) //判斷是否在""中,如果在,不需要去除
{
count ++;
p = 1;
if(count == 2)
{
p =0;
count = 0;
}
}
if(ch3 == '\'' && p == 0)
{
count ++;
c = 1;
if(count == 2)
{
c =0;
count = 0;
}
}
if(count == 0 && temp == 0 && ch3 == '*') //判斷是否出現單獨*/錯誤
{
ch1 = fgetc(fp1);
if(ch1 == '/')
{
printf("error:*/error character\n");
}
else
{
t=1;
}
}
if(ch3 == '/' && count ==0) //消除註釋
{
ch1 = fgetc(fp1);
if(ch1 == '/')
{
flag=1;
}
else if(ch1='*')
{
temp = 1;
flag = 1;
}
}
if(ch1 == '\n' && temp != 1)
{
flag=0;
}
if(flag == 0)
{
fputc(ch1,fp2);
}
if(t == 1)
{
fputc(ch3,fp2);
fputc(ch1,fp2);
}
if(temp == 1)
{
ch3 = ch1;
if(ch3 == '*')
{
ch1 = fgetc(fp1);
if(ch1 == '/')
{
temp = 0;
flag = 0;
}
}
}
ch1 = fgetc(fp1);
}
if(temp == 1 ) //判斷是否有出現/*,而沒有*/來結束的錯誤
{
printf("error:/*error\n");
}
fclose(fp1);
fclose(fp2);
return 0;
}