精华内容
下载资源
问答
  • 一道文件操作初应用的题目: 首先我们可以直接的看到该题目中代码需要我们分几种情况去做出不一样的操作。 如果有/,则分为3种情况 1://连在一起。 2./*连在一起。 3.单就一个/。 对于第二种情况还得细分...

    这是一道文件操作初应用的题目:

    首先我们可以直接的看到该题目中代码需要我们分几种情况去做出不一样的操作。

    如果有/,则分为3种情况

    1://连在一起。

    2./*连在一起。

    3.单就一个/。

    对于第二种情况还得细分,因为*后面的代码可能是/也可能不是/。

    如果没有/,则打印在屏幕上。

     故情况如图:

     

    #include<stdio.h>
    int main()
    {
    	FILE*p1=fopen("hello.c","r");//打开hello.c文件并只读 
    	FILE*p2=fopen("comment.txt","w");//打开comment.txt文件并只写 
    	char g;
    	if(p1==NULL)//检测文件是否打开成功 
    	{
    		  printf("hello.c文件打开失败\n"); 
    	 } 
    	 if(p2==NULL)//检测文件是否打开成功 
    	 {
    		 printf("hello.c文件打开失败\n");
    	 } 
    	while(!feof(p1))//检测文件是否到结尾 
    	{
    		g=fgetc(p1);
    		if(g=='/')//如果遇到/字符 
    		{
    			g=fgetc(p1);
    			if(g=='/')//情况1://连在一起,则后面整句读入conment.txt 
    			{
    				while((g=fgetc(p1))!='\n')
    				{
    					fputc(g,p2);//写入文件comment.txt 
    				}
    				fputc(g,p2);//把换行符也写进去 
    				if((g=fgetc(p1))!='/')//由于题目要求后面几句//整句存完之后要在stdout上打印出空格而第一句却不用故想用这种方法来进行一个判断 
    				{
    					printf("\n");
    					}
    					fseek(p1,-1,SEEK_CUR);//文件指针标识回退	
    				continue;
    				
    			}
    			else
    			{
    				if(g=='*')//情况2:/*类型则需要找到下一个*/才行 
    				{
    				 while((g=fgetc(p1))!='*')//找到* 
    				 {
    				 	fputc(g,p2);
    				 }
    				 g=fgetc(p1);
    				 if(g=='/')//判断是否为*/ 
    				 {
    				 	fputc('\n',p2);//是的话就完成一段/**/的写入文件操作了 
    				 	continue;
    				 }
    				 else
    				 {
    				 	fseek(p1,-1,SEEK_CUR);//如果*下一个字符并不是/则需要使文件指针回退 
    				 	fputc('*',p2);
    				 	while((g=fgetc(p1))!='*')//死方法,只能适用于本题 
    				 	{
    				 		fputc(g,p2);
    					 }
    					 fseek(p1,1L,SEEK_CUR);
    					 g=fgetc(p1);
    					 fputc(g,p2);
    					 
    					 continue;
    
    				 	
    				 }
    				}
    				else//情况3:代码中有/字符而不需要做处理的情况 
    				{
    					fseek(p1,-2,SEEK_CUR);//回退并读入即可 
    					g=fgetc(p1);
    					printf("%c",g);
    					continue;
    				}
    			}
    		
    		} 
    		else//无/则打印在stdout上即可 
    		{
    				printf("%c",g);
    				if(g=='}')//判断是否是最后一句代码,由于题目最后一句代码不需要再多打印一个换行,故进行该操作 
    				return 0;	
    		}
    	}
    	fclose(p1);
    	fclose(p2);
    }

    这是我一开始写的代码,虽然思路很麻烦,但总算提交是满分了,但是我这个做法的话只能针对这一道题,如果在/*中有多个*那么这个代码就实现不了所需要的功能了,如果要用于更多情况的话就得将/*这种情况中代码做修改。

    修改后代码如下/*与*/直接的*问题得以解决,但其他还是比较固定,暂时没有想出别的方法。

    #include<stdio.h>
    int main()
    {
    	FILE*p1=fopen("hello.c","r");//打开hello.c文件并只读 
    	FILE*p2=fopen("comment.txt","w");//打开comment.txt文件并只写 
    	char g;
    	if(p1==NULL)//检测文件是否打开成功 
    	{
    		  printf("hello.c文件打开失败\n"); 
    	 } 
    	 if(p2==NULL)//检测文件是否打开成功 
    	 {
    		 printf("hello.c文件打开失败\n");
    	 } 
    	while(!feof(p1))//检测文件是否到结尾 
    	{
    		g=fgetc(p1);
    		if(g=='/')//如果遇到/字符 
    		{
    			g=fgetc(p1);
    			if(g=='/')//情况1://连在一起,则后面整句读入conment.txt 
    			{
    				while((g=fgetc(p1))!='\n')
    				{
    					fputc(g,p2);//写入文件comment.txt 
    				}
    				fputc(g,p2);//把换行符也写进去 
    				if((g=fgetc(p1))!='/')//由于题目要求后面几句//整句存完之后要在stdout上打印出空格而第一句却不用故想用这种方法来进行一个判断 
    				{
    					printf("\n");
    					}
    					fseek(p1,-1,SEEK_CUR);//文件指针标识回退	
    				continue;
    				
    			}
    			else
    			{
    				if(g=='*')//情况2:/*类型则需要找到下一个*/才行 
    				{
    				 while(1)
    				 {
    				 	g=fgetc(p1);
    				 	if(g=='*')//有颗星 
    				 	{
    				 		g=fgetc(p1);
    				 		if(g=='/')
    				 		{
    				 			g=fgetc(p1);
    				 			g=fgetc(p1);//判断是否是进入#include那段 
    				 			if(g!='#')
    				 			{
    				 				fseek(p1,-2,SEEK_CUR);
    							 }
    							 else
    							 {
    							 }
    							 fputc('\n',p2);
    
    				 			break;
    						 }
    						 else//但*后面并不是/ 
    						 {
    						 	fputc('*',p2);//把星还了 
    						 	fseek(p1,-1,SEEK_CUR);
    						 	continue;
    						 }
    					 }
    					 else
    					 {
    					 	fputc(g,p2);
    					 }
    				  } 
    				}
    				else//情况3:代码中有/字符而不需要做处理的情况 
    				{
    					fseek(p1,-2,SEEK_CUR);//回退并读入即可 
    					g=fgetc(p1);
    					printf("%c",g);
    					continue;
    				}
    			}
    		
    		} 
    		else//无/则打印在stdout上即可 
    		{
    				printf("%c",g);
    				if(g=='}')//判断是否是最后一句代码,由于题目最后一句代码不需要再多打印一个换行,故进行该操作 
    				return 0;	
    		}
    	}
    	fclose(p1);
    	fclose(p2);
    }

     

    展开全文
  • C语言写的源程序是一种文本文件。本项目将以C语言源程序为操作对象,完成对源程序的一系列处理,如判断是否有main函数、将某些行加上注释等。各功能可以分别编制一个程序实现(建议用这种简单的方案),也可以将...

    返回:贺老师课程教学链接

    【项目3 - 处理C语言源代码的程序】
    用C语言写的源程序是一种文本文件。本项目将以C语言的源程序为操作对象,完成对源程序的一系列处理,如判断是否有main函数、将某些行加上注释等。各功能可以分别编制一个程序实现(建议用这种简单的方案),也可以将其集成在一起(向着自己做出IDE努力)。
    (1)读入一个C++程序,判断其中是否只有一个main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,或者“不能定义多个main()函数”;
    提示1:简单处理,可以只比较判断“main()”,考虑实际上的各种可能,main后面的括号中有任意多个空格及void的都应该算在内。建议按最简单的情形处理。
    提示2:建议设计一个函数,将读到的代码与字符串“main()”进行比较。函数用于判断s1是否“包含”在读入的一行s2中,调用时,形参s1处的实参用”main()”即可,这样写提升了“抽象”级别,更容易实现,对应更高的代码质量。
    [参考解答]

    #include <stdio.h>
    #include <stdlib.h>
    int appear(char*s1,char*s2);
    int main( )
    {
        char line[256];
        char main_fun[8]="main";
        int main_num=0;//初时,尚未发现
    
        //将文件中的数据读入到字符数组中
        FILE *fp;
        if((fp=fopen("source.c","r"))==NULL)
        {
            printf("源程序文件不存在!\n");
            exit(1);
        }
        while(!feof(fp))
        {
            fgets(line,255,fp);
            main_num+=appear(line,main_fun);
            if (main_num>1)  //多于1个,没有必要再去读取
                break;
        }
        fclose(fp);
    
        //识别结论
        if(main_num==0)
            printf("error: no \"main\".");
        else if (main_num==1)
            printf("right: a \"main\" be exist.");
        else
            printf("error: more than one \"main\".");
        printf("\n");
        return 0;
    }
    
    //返回s2在s1中出现了几次
    int appear(char*s1,char*s2)
    {
        int n=0,flag;
        char *p,*q;
        for(; *s1!='\0'; s1++)
        {
            if (*s2==*s1) /*判断字符串中是否有和要判断的字串首字符相同的字符*/
            {
                flag=1;
                p=s1 ; /*s1 p 为第一个相同字符的地址*/
                q=s2;
                for(; *q!='\0';) /*如果有则判断接下去的几个字符是否相同*/
                {
                    if (*q++!=*p++)
                    {
                        flag=0;
                        break;
                    }
                }
                if (flag==1) n++;
            }
    
        }
        return(n);
    }

    (2)读入一个C语言程序,使程序中的所有左花括号“{”和右花括号“}”都单独占一行,新程序保存到另一个.c文件中,并在屏幕上显示处理过的程序,显示时加上行号。
    [参考解答]

    #include <stdio.h>
    #include <stdlib.h>
    
    int main( )
    {
        char ch1,ch2;
        FILE *fpin, *fpout;
        if((fpin=fopen("source.c","r"))==NULL)
        {
            printf("源程序文件不存在!\n");
            exit(1);
        }
        if((fpout=fopen("newsource.c","w+"))==NULL)
        {
            printf("无法建立输出文件!\n");
            exit(1);
        }
        ch1='\0';
        while(!feof(fpin))
        {
            ch2=fgetc(fpin);
            //读到了花括号,且前一个符号不是换行,应该加入一个换行
            if((ch2=='{'||ch2=='}')&&(ch1!='\n'))
                fputc('\n',fpout);
            else
                //当前读到的不是换行,但前一个是花括号,此时也该加
                if((ch1=='{'||ch1=='}')&&(ch2!='\n'))
                    fputc('\n',fpout);
            fputc(ch2,fpout);  //输出当前读入的符号
            ch1=ch2;
        }
        rewind(fpout);
        printf("经过处理后的源程序是\n");
        char line[256];
        int n = 1;
        while (!feof(fpout))
        {
            fgets(line,255,fpout);
            printf("%d\t%s", n, line);
            n++;
        }
        fclose(fpin);
        fclose(fpout);
        return 0;
    }

    注:此解仍有些缺憾。花括号已经单独占一行(前后可能有空格)时,也要换行。感兴趣的同学可以想办法改进程序,避免出现这样的问题。

    (3)读入一个C语言程序,输入m、n两个数字,从第m行起的n行代码将作为注释使用(即在这些行前面加上”//”),新程序保存到另一个.c文件中,并在屏幕上显示处理过的程序,显示时加上行号。
    [参考解答]

    #include <stdio.h>
    #include <stdlib.h>
    
    int main( )
    {
        char line[256];
        FILE *fpin, *fpout;
        if((fpin=fopen("source.c","r"))==NULL)
        {
            printf("源程序文件不存在!\n");
            exit(1);
        }
        if((fpout=fopen("newsource.c","w+"))==NULL)
        {
            printf("无法建立输出文件!\n");
            exit(1);
        }
        int m,n;
        printf("您要将第m行开始的n行代码作为注释,请输入m和n:");
        scanf("%d %d", &m, &n);
        int n1=0;
        fgets(line,255,fpin);
        while(!feof(fpin))
        {
    
            n1++;
            if(n1>=m&&n1<m+n)
            {
                fputc('/',fpout);
                fputc('/',fpout);
            }
            fputs(line,fpout);
            fgets(line,255,fpin);
        }
        rewind(fpout);
        printf("经过处理后的源程序是\n");
        n=0;
        fgets(line,255,fpout);
        while (!feof(fpout))
        {
    
            printf("%d\t%s", n, line);
            n++;
            fgets(line,255,fpout);
        }
        fclose(fpin);
        fclose(fpout);
        return 0;
    }
    展开全文
  • 源程序(源代码)指按照一定的程序设计语言规范编写的未经过编译的文本文件具有可读性的计算机语言指令。可以比作自己手写的程序代码。 可执行程序(Executable Program,EXE file)可以在操作系统存储空间中...

    源程序(源代码)是指按照一定的程序设计语言规范编写的未经过编译的文本文件,是具有可读性的计算机语言指令。可以比作自己手写的程序代码。

    可执行程序(Executable Program,EXE file)是可以在操作系统存储空间中浮动定位的二进制可执行程序。一般软件安装后会生成可执行文件,可以直接加载到内存中,并又操作系统加载并执行。

    以 C 语言为例,自己编写的源代码文件扩展名为 c,这个 c 文件就是源文件。从源文件到可执行文件一般需要经过几个步骤:预处理->编译->汇编->链接这四个过程。

    • 预处理:预处理相当于根据预处理命令将源代码转换为新的 c 程序,不过通常以 i 为扩展名。
    • 编译:将得到的 i 文件翻译成汇编代码,通常以 s 为扩展名。
    • 汇编:将汇编文件翻译为机器指令,并打包成可重定位目标程序的 o 文件。
    • 链接:将引用的其它 o 文件加到汇编后的 o 文件中,处理后得到最终的可执行文件。

    这里首先在 linux 操作系统中编写源代码,并命名为 hello.c,内容如下:

    #include <stdio.h>
    
    int main()
    {
        printf("Hello world!\n");
        return 0;
    }

     一个很简单的源代码,但是这样的源代码如果不是在集成开发环境(Integrated Development Environment,IDE)中是不能够直接点击执行的,需要经过一系列的操作,具体为:

    # 预处理
    gcc -E hello.c -o hello.i
    # 编译
    gcc -S hello.i -o hello.s
    # 汇编
    gcc -c hello.s -o hello.o
    # 链接
    gcc hello.o -o hello

    经过以下操作后,就能够发现在 hello.c 文件同级目录中出现了文件 hello.i,hello.s,hello.o,hello。可知文件 hello 即为可执行程序,我们在终端中输入下方的指令,就能够看到最后的输出结果。

    ./hello
    展开全文
  • 程序使用C语言实现UTF8到GBK的文本文件的转码,适用于大批量的文件编码转换。读文件和写文件均使用了缓存方式,在普通PC上测试,转码平均速度约11MB/S。  基本逻辑建立一个64KB的UTF8到GBK字符集的映射数组,...

          本程序使用C语言实现UTF8到GBK的文本文件的转码,适用于大批量的文件编码转换。读文件和写文件均使用了缓存方式,在普通PC上测试,转码平均速度约11MB/S。

          基本逻辑是建立一个64KB的UTF8到GBK字符集的映射数组,读取源文件,并在映射数组中查找每个字符对应的GBK编码,输出到新的文件。

          程序中UTF-16BE_FIXED.txt和GBK_FIXED.txt是编码一一映射的对照文件,可以根据需要自行建立,这两个文件的读取时间可以忽略不计。

          调用方法:utf2gbk.exe 源文件名 目标文件名。

          读写缓存均设置为32KB,参照以下测试结果确定,实际转码效率的决定于磁盘IO。

          测试结果:

         

    读缓存(BYTE) 写缓存
    (BYTE)
    时间(S) 文件大小
    (BYTE)
    平均速度(MB)
    4096 4096 8.590011 95764200 10.63187
    4096 8192 8.335358 95764200 10.95668
    4096 16384 8.339024 95764200 10.95186
    4096 32768 8.455411 95764200 10.80111
    4096 65536 8.17109 95764200 11.17695
    4096 131072 8.071299 95764200 11.31514
    8192 4096 8.325038 95764200 10.97026
    8192 8192 8.530569 95764200 10.70595
    8192 16384 8.280397 95764200 11.02941
    8192 32768 8.378514 95764200 10.90025
    8192 65536 8.062362 95764200 11.32768
    8192 131072 7.995 95764200 11.42312
    16384 4096 8.326182 95764200 10.96876
    16384 8192 8.286298 95764200 11.02155
    16384 16384 9.060944 95764200 10.07929
    16384 32768 8.31521 95764200 10.98323
    16384 65536 8.099703 95764200 11.27546
    16384 131072 7.904147 95764200 11.55442
    32768 4096 7.941703 95764200 11.49978
    32768 8192 7.979317 95764200 11.44557
    32768 16384 7.859548 95764200 11.61999
    32768 32768 7.698843 95764200 11.86254
    32768 65536 9.86077 95764200 9.261737
    32768 131072 8.409786 95764200 10.85971
    65536 4096 9.594587 95764200 9.518686
    65536 8192 9.589273 95764200 9.523961
    65536 16384 9.461487 95764200 9.65259
    65536 32768 9.380491 95764200 9.735936
    65536 65536 8.962597 95764200 10.18989
    65536 131072 8.751248 95764200 10.43598
    131072 4096 8.316328 95764200 10.98175
    131072 8192 8.284002 95764200 11.02461
    131072 16384 8.336569 95764200 10.95509
    131072 32768 8.548768 95764200 10.68316
    131072 65536 8.768317 95764200 10.41567
    131072 131072 8.627917 95764200 10.58516

     

    C程序源码:

    注:代码中涉及的GBK_FIXED.txt、UTF-16BE_FIXED.txt为GBK和UTF-16BE字符的一一映射文件。

    以下为下载链接

    GBK_FIXED.txt

    UTF-16BE_FIXED.txt


    展开全文
  • c语言文件操作程序

    2016-10-18 22:16:09
    用 C 语言写的源程序是一种文本文件。本项目以 C 语言的源程序为操作对象,完成对源程序的一系列处理,如判断是否有 main 函数、将某些行加上注释等。各功能可以分别编制一个程序实现(建议用这种简单的方案)...
  • 根据文件中数据组织形式的不同,可以把文件分为文本文件和二进制文件,C语言源代码是文本文件,编译后的可执行程序是二进制文件。一、文本数据和二进制1、文本数据文本数据由字符串组成,存放了每个字符的 ASCII码值...
  • C语言程序设计文件 C语焉不详一、文件的分类按内容分源程序文件 目标文件 数据文件按数据组织形式分文本(字符)文件 二进制文件二、文件类型指针一个指针变量指向一个文件,这个指针称为文件指针,文件进行的各种操作...
  • 文件的基本概念文件是程序设计中的一个重要概念。所谓“文件”一般指存储在外部介质上数据的集合。我们将数据的输入输出形象地称为“流”,即数据流,它表示了数据从到目的端的流动。文件名和文件路径 D:\CC\temp\...
  • 文件文件是数据的集合体,对文件的处理过程就是对文件的读写过程,或输入输出过程。...文本文件可以在屏幕上按字符显示,源程序文件就是文本文件,由于是按字符显示,所以能读懂文件内容。二进制文件是按...
  • C语言中的文件操作

    2020-11-23 20:36:46
    包括源程序文件(后缀为.c)、目标文件(windows环境后缀为.obj)、可执行程序(windows环境后缀为 .exe) 数据文件: 文件的内容不一定程序,而是程序运行时读写的数据,比如程序运行时需要从中读取数据的文件,...
  • C语言文件操作

    2021-05-07 09:25:42
    C语言文件操作1.文件是什么2....程序文件:源程序文件(.c),目标文件(windows下为.obj),可执行文件(windows下为.exe)。 数据文件:程序运行时读写的数据。 文件类型:文本文件,二进制文件。 文件名:一
  • 代码使用方法(以实例1为例): 将该实例的源码,比如实例1的1.c文件(可以在001目录下找到), 拷贝到tc编译器目录下,运行tc.exe,打开编译器, 按【F3】键或者“File->Open”菜单命令,打开1.c文件, ...
  • C语言程序设计实验第三版:文件程序设计

    千次阅读 多人点赞 2020-06-07 22:41:31
    /我咕咕,哈哈哈。今天也有好好学/ 实验七、文件程序设计(p121–p125) 一、实验目的 ...1.源程序: #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; char ch[80]; fp=fopen("a
  • C源文件一种文本文件,可以通过程序进行操作。(1)读入一个C程序,判断其中是否只有一个main()函数,输出“暂时没有发现问题”,或者“没有main()函数”,或者“不能定义多个main()函数”;提示1:简单处理,可以...
  • C语言文件操作详解

    2021-03-20 16:33:06
    程序文件:包括源程序文件(xxx.c),目标文件 (在windows环境下的.obj),可执行程序(windows下的…exe)。 数据文件:一般指数据库的文件 其中数据文件根据数据的组织形式,数据文件又被称为文本文件或者二...
  • #include 命令预处理命令的一种,预处理命令可以将别的代码内容插入到所指定的位置;可以标识出只有在特定条件下才会被编译的某一段程序代码;可以定义类似标识符功能的宏,在编译时,预处理器会用别的文本取代...
  • 【含有错误的源程序】 #include #include #include void cutpaste(char *line,int source,int len); { char t[20]; int i,length=strlen(line); if(source>=length)return; for(i=0;i;i++) t[i]=...
  • C语言 文件操作

    2021-01-17 16:21:14
    包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。 数据文件 文件的内容不一定程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者...
  • C语言文件操作

    2020-11-24 21:17:09
    但是在程序设计中,我们一般谈的文件有两种:程序文件(包括源程序文件(.c),目标文件(.obj),可执行程序(.exe))、数据文件(文件的内容不一定程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据...
  • C语言 关于文件操作

    2020-12-02 23:10:32
    包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。 2.数据文件 文件的内容不一定程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件...
  • 注意:其中源程序、修改了的源程序和汇编程序都是文本文件,而可重定位目标程序和可执行目标程序都是二进制文件。 似乎到这里就该结束了,因为整个过程已经讲完了?。当然如果只是这样介绍的话本文就没有存在的价值...
  • C语言文件操作

    2019-06-27 00:33:20
    1.程序文件:包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀 为.exe)。 2.数据文件:文件的内容不一定程序,而是程序运行时读写的数据,比如程序运行需要从中读取...
  •   我们编写的程序称为源程序源程序保存在源文件中,源文件的后缀一般为“.c”,源文件是文本文件1,我们可以直接看懂,但是机器“看不懂”,所以要进行翻译,把源程序翻译成可执行程序,可执行程序保存在可执行...
  • 我们经常需要把计算后的数据存入txt文本,下例提供了一种简单思路:#... //定义换行转义字符//现在你的源程序的目录下建立一个比如说data.txt文件,也可以不建,程序会自动新建data.txt文件FILE *fp; //定义文...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 535
精华内容 214
关键字:

c语言源程序文件是文本文件

c语言 订阅