精华内容
下载资源
问答
  • 知识覆盖  基本程序设计技术,递归程序设计,程序结构,文件,结构体,类型定义 实验内容 1.分别调试课件中的给定n求Fibonacci(n)递归与非...3. (自选题)编写程序,统计英文文件中的每个单词的出现次数(词频)。
  • 根据文件在特定的系统中实现的方式不同,fopen的调用可能失败或者破坏文件中的内容。更新文件最普遍的方法是:先写新数据到临时文件中,然后更新文件的整个内容之后,用临时文件替换原有文件。因此,...

    在许多文件处理应用中,你可能对创建一个新的文件不感兴趣,但是对修改已存在的文件感兴趣。修改文件的过程称为更新文件。这不像想象的那么简单。

    在大多数系统中,如果一个文件因为输入而打开着,再要为输出打开它是不合法的。根据文件在特定的系统中实现的方式不同,fopen的调用可能失败或者破坏文件中的内容。

    更新文件最普遍的方法是:先写新数据到临时文件中,然后更新文件的整个内容之后,用临时文件替换原有文件。因此,如果希望编写程序来更新已有的文件,该程序下面的步骤组成:

    1)打开原有的输入文件;

    2)打开一个不同名的临时输出文件;

    3)把输入文件复制到临时文件,执行希望的更新操作;

    4)关闭两个文件;

    5)删除原始文件;

    6)用原始文件的名称重命名临时文件;

    为了实现这个策略,需要用到3个来自stdio.h接口的函数:tmpnam、remove和rename。

    尽管你可以为临时文件自由地选择名称,但是在stdio.h接口中有一个tmpnam函数可以生成临时文件。临时文件的约定,随一台机器的不同而不同。调用tmpnam(null)函数返回一个适合机器的临时文件名。因此,可以使用下面的编码创建和打开一个新的临时文件:

    temp = tmpnam(NULL);

    outfile = fopen(temp,"w");

    为了删除一个文件,只需要调用remove(name)就可以了,其中的name是该文件的名称。重命名文件也很简单,可以通过调用rename(old name, new name)函数来实现。

    与ANSI库中的许多函数一样,remove和rename在正确时返回0,在失败时返回非0值。尽管你会遇到把这些函数只是看成出来过程的代码,但是通过它们的返回值来确保操作的成功是比较安全的。

    这3个函数可以使用我们编写一个使用CopyRemovingComments函数从文件中删除注释的程序,如下所示:

    void CopyRemovingComments(FILE* infile,FILE* outfile)

    {

    int ch,nch;

    bool commentFlag;

    commentFlag = false;

    while((ch = getc(infile))!=EOF){

    if (commentFlag)

    {

    if (ch == '*')

    {

    nch = getc(infile);

    if (nch == '/')

    {

    commentFlag=false;

    }

    else

    {

    ungetc(nch,infile);

    }

    }

    }else{

    if (ch == '/')

    {

    nch = getc(infile);

    if (nch == '*')

    {

    commentFlag=false;

    }

    else

    {

    ungetc(nch,infile);

    }

    }

    if (!commentFlag)

    {

    putc(ch,outfile);

    }

    }

    }

    }

    void main()

    {

    string filename,temp;

    FILE *infile,*outfile;

    printf("This program removes comments from a file.\n");

    while(true){

    printf("File name: ");

    filename = getline();

    infile = fopen(filename,"r");

    if(infile != NULL)

    break;

    printf("File %s not found -- try again.\n",filename);

    }

    temp = tmpnam(NULL);

    outfile = fopen(temp,"w");

    if (outfile == NULL)

    {

    Error("Can't open temporary file.");

    }

    CopyRemovingComments(infile,outfile);

    fclose(infile);

    fclose(outfile);

    if (remove(filename)!=0 || rename(temp,filename)!=0)

    {

    Error("Unable to rename temporary file.");

    }

    }

    展开全文
  • “输出”是C语言文件数据编程概念,在C语言文件数据的输入输出中,当调用输出函数把程序中变量的值输出到外部文件中时,这种操作称为“输出”或“写”。 程序员们为了便于记忆和理解,通常将“输出”和“写”共读为...

    “输出”是C语言文件数据编程概念,在C语言文件数据的输入输出中,当调用输出函数把程序中变量的值输出到外部文件中时,这种操作称为“输出”或“写”。
    程序员们为了便于记忆和理解,通常将“输出”和“写”共读为:写出。
    这与别于“读”,即“输入”。

    读入
    fscanf(文件指针,格式控制字符串,输入项表);
    fread(buffer,size,count,fp);
    ch=fgetc(pf);
    fgets(str,n,fp);
    写出
    fprintf(文件指针,格式控制字符串,输入项表);
    fwrite(buffer,size,count,fp);
    fputc(ch,fp);
    fputs(str,fp);
    注意:
    1、以上每个函数都以“f”开头,其代表文件(file)之意,这正与正常数据的输入输出(scanf和printf)函数区分开来;str代表字符串(string)之意,ch则是代表字符(characters);fp代表文件指针(file pointer),而pf代表指向文件的文件指针,即“文件指针指向”(Pointing to file pointer),通常也叫做文件指针;
    2、文件字符的输入输出函数也可写为:getc和putc,它们与fgetc和fputc函数是等价的;
    3、要注意正常“字符”的输出(ch=getchar())输入(putchar(ch))与“文件字符”的输入输出的函数调用上的区别。

    展开全文
  • C语言 | 文件打开关闭

    2021-05-13 21:06:40
    用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且该文件应该已经存在,并存有数据,这样程序才能从文件中数据。 用“w”方式打开的文件只能用于向该文件写数据,而不能用来向计算机...

    C语言用fopen函数打开数据文件

    fopen函数的调用方式为

    fopen(文件名,使用文件方式);
    

    例如:

    fopen("file",“r”)
    
    //表示要打开名字为“a1”的文件,使用文件方式为“读入”。
    

    C语言文件打开注意事项

    用“r”方式打开的文件只能用于向计算机输入而不能用作向该文件输出数据,而且该文件应该已经存在,并存有数据,这样程序才能从文件中读数据。

    用“w”方式打开的文件只能用于向该文件写数据,而不能用来向计算机输入,如果希望向文件末尾添加新的数据(不希望删除原有数据),则应该用“a”方式打开。

    用“r+”、“w+”,“a+”方式打开的文件既可用来输入数据,也可用来输出数据,如果不能实现“打开”的任务,fopen函数将会带回一个出错信息。

    计算机从ASCII文件读入字符时,遇到回车换行符,系统把它转换为一个换行符,在输出时把换行符转换成为回车和换行两个字符。程序中可以使用3个标准的流文件——标准输入流、标准输出流、标准出错输出流。

    C语言用fclose函数关闭数据文件

    fclose函数调用的一般形式

    fclose(文件指针)
    
    fclose(file)
    
    //前面曾把打开文件时函数返回的指针赋给了file,现在把file指向的文件关闭,此后file不再指向该文件。
    

    在使用完一个文件后应该关闭它,以防止它再被误用。

    关闭就是撤销文件信息区和文件缓冲区,使文件指针变量不再指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作,除非再次打开,使该指针变量重新指向该文件。

    以上,如果你看了觉得对你有所帮助,就给小林点个赞,分享给身边的人叭,这样小林也有更新下去的动力,跪谢各位父老乡亲啦~

    100道C语言源码案例请去公众号:C语言入门到精通

    展开全文
  • C语言读写文件

    2018-09-30 09:57:01
    作业要求在xv6操作系统...但一开始对C语言不熟悉(不知道可以通过head file或extent来共享数据),所以只想到每次调用system call的时候进行读写操作,将结果写进txt文本,然后新的system call只负责读取文件。这...

    作业要求在xv6操作系统里面增加一个新的system call,这个system call要将程序执行过程中所有执行过的system call记录下来,以及与kernel进行交互的次数。但一开始对C语言不熟悉(不知道可以通过head file或extent来共享数据),所以只想到每次调用system call的时候进行读写操作,将结果写进txt文本,然后新的system call只负责读取文件。这个最终没有实现。第一,读写本身属于system call,会整的很混乱;第二,没法记录与kernel交互的情况;第三,system call文件太多,而且位置不在一起。。。

    虽然做了无用功,但总归顺便学习了C语言,应该记录下来。

    总体思路是这样的。

    1. 首先txt文档的格式应该确定下来。它应该包含以下数据:a)第一行放system call的种类的个数,或者说行数;b)第二行第一个位置放system call字符串的长度;c)第二行第二个位置放system call的名字;d)第二行第三位置放该system call执行了几次...

    如下:

    4
    8 command1 1
    8 command2 2
    8 command3 1
    8 command4 1
    

     这样做的目的是为了以后malloc方便一点。

    2. 无论读写,首先要准备一个FILE型指针变量,它控制文件的开关以及是可以执行什么操作(fd),就好像是文件和用户交互的中转站。例如 FILE *pointer = fopen("1.txt", "r");表示用pointer来联系到1.txt,并执行读操作。但注意,如果文件不存在,pointer为NULL,不能使用fclose(pointer); 命令,否则报错。但FILE *pointer = fopen("1.txt", "w");的话没关系,因为“w”操作即使没有文件,也会创造一个新文件,保证了pointer不为NULL,因此程序后期必须用到fclose(pointer);。还有写文件的时候,比如1.txt,一定写明白”.“后面文件类型。

    3. 读操作:fscanf(pointer, “%i %s”, num, string);表示将pointer(pointer对应的必然是“r”操作)所对应的文件里面的两个物品(必然是整数和字符串),放到早已定义好的num和string变量里面去。之所以是两个物品是因为他们之间用空格或回分隔。

    4. 写操作:fprintf(pointer, “%i %s\n”, num, string);表示将两个物品(必然是整数和字符串)放到pointer(pointer对应的必然是“w”操作)所对应的文件里面去。注意“%i %s\n”已经将两个物品用空格加以区分,而且还换行,但是读操作的时候不管回车还是空格都直接跳过。

    5. 关闭文件:fclose(pointer);pointer不能为NULL。

    6. 删除文件:remove(”1.txt“);

    7. 重命名:rename("1.txt", "2.txt");

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    //建立结构体,包含一个字符型指针变量,以及一个整数。
    typedef struct
    {
    	char *commandName;
    	int commandNumber;
    }commandInfo;
    
    
    void updateFile(char *inputCommandName)
    {
    	//开两个文件一个新一个旧。
        FILE *origionalFile = fopen("record.txt", "r");
    	FILE *newFile = fopen("newRecord.txt", "w");
    
    	
        //”record.txt“被删除了,或没被建立,在新文件写入上述格式的数据。
        if (origionalFile == NULL)
    	{
    		fprintf(newFile, "%i\n", 1);
    		fprintf(newFile, "%i %s %i", strlen(inputCommandName), inputCommandName, 1);
    	}
    	//”record.txt“里面有东西,就将他们提取出来放到结构体里面,注意提取的过程中如果发现经要写入的 
        //system call信息原文件里有,那就在后面加一。
        else
    	{
    		int totalNumber;
    		fscanf(origionalFile, "%i", &totalNumber);
    		//根据最开始的system call种类数,为结构体开辟足够空间。
            commandInfo *info = (commandInfo*) malloc(sizeof(commandInfo) * (totalNumber));
    		//设一个旗帜,如果原文件的内容全部写到结构体后,没法发现新system call,就在新文件最后头            
            //加上它
            int isRepeated = 0;
    		//根据开头行数,将每行内容保存到结构体里面。
            for (int i = 0; i < totalNumber; i++)
    		{
    			int nameLen;
    			fscanf(origionalFile, "%i", &nameLen);
    			//每行前头的system call长短,就是为了malloc的。
                char *tempName = (char *) malloc(sizeof(char) * (nameLen + 1));
    			//string最后需要以‘\0’结尾。
                tempName[nameLen] = '\0';
    			int tempNum;
    
    			fscanf(origionalFile, "%s %i", tempName, &tempNum);
    
    			//比较下原文件里面有没有本次的system call,有就设置旗帜,顺便加一。
                if (strcmp(tempName, inputCommandName) == 0)
    			{
    				isRepeated = 1;
    				tempNum++;
    			}
    			info[i].commandName = tempName;
    			info[i].commandNumber = tempNum;
    			//结构体还不是很理解,似乎结构体里面保存的是指针,因此这里free的话会导致数据丢失。
                //free(tempName);
    		}
    		//system call是不新元素,直接从结构体取出信息写到新文件里。
            if (isRepeated == 1)
    		{
    			fprintf(newFile, "%i\n", totalNumber);
    			for (int i = 0; i < totalNumber; i++)
    				fprintf(newFile, "%i %s %i\n", strlen(info[i].commandName), info[i].commandName, info[i].commandNumber);
    			
    		}
    		//新system call,行数要首先加一,结构体写完以后,在把新system call信息写到最后面。
            else
    		{
    			fprintf(newFile, "%i\n", totalNumber + 1);
    			for (int i = 0; i < totalNumber; i++)
    				fprintf(newFile, "%i %s %i\n", strlen(info[i].commandName), info[i].commandName, info[i].commandNumber);
    			fprintf(newFile, "%i %s %i\n", strlen(inputCommandName), inputCommandName, 1);
    		}
    
    		//结构体没用了,把它释放。但是前面在heap里开辟的那些Name还没有释放,回头改一下。
            free(info);
    		//关掉老文件。
            fclose(origionalFile);
    	}
    	
    	fclose(newFile);
    
    	remove("record.txt");
    	rename("newRecord.txt", "record.txt");
    }
    
    //读文件,显示在屏幕上。每次执行完以后删除txt文件。
    void readFile()
    {
    	FILE *file = fopen("record.txt", "r");
    	if (file == NULL)
    	{
    		printf("No system call!");
    		return;
    	}
    	else
    	{
    		int totalNum;
    		fscanf(file, "%i", &totalNum);
    		printf("System call type: %d\n", totalNum);
    		for (int i = 0; i < totalNum; i++)
    		{
    			int length;
    			fscanf(file, "%i", &length);
    			char *tempName = (char *) malloc(sizeof(char)*(length+1));
    			tempName[length] = '\0';
    			int tempNum;
    			fscanf(file, "%s %i", tempName, &tempNum);
    			printf("System call name: %s   times: %d\n", tempName, tempNum);
    		}
    		fclose(file);
    	}
    	remove("record.txt");
    }
    
    
    int main()
    {
    	char temp1[10] = "command1";
    	updateFile(temp1);
    	char temp2[10] = "command2";
    	updateFile(temp2);
    	char temp3[10] = "command3";
    	updateFile(temp3);
    	char temp4[10] = "command4";
    	updateFile(temp4);
    	char temp5[10] = "command2";
    	updateFile(temp5);
    
    	readFile();
    
    	return 0;
    }

    执行后的结果: 

    System call type: 4
    System call name: command1   times: 1
    System call name: command2   times: 2
    System call name: command3   times: 1
    System call name: command4   times: 1

     

    展开全文
  • Python中调用C语言函数

    2019-07-25 10:51:41
    ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。 示例如下 实现两数求和的C代码,保存为add.c //sample C file to add ...
  • c语言文本文件的读写

    千次阅读 2019-07-17 17:16:57
    c程序如何从文本文件中读取数据? 比如编程从某一个后缀.txt的文件读取数据并在终端框中显示, 在头文件“stdio.h”中有FILE结构类型的声明,编写程序时建立指针与文件之间的联系,一般会设置一个FILE *fp1;的指针...
  • C语言中调用可执行程序的方法。

    千次阅读 2020-01-03 09:41:53
    在C/C++程序,经常需要调用其它的程序来先成某项任务,例如...它可以根据指定的文件名或目录名找到可执行文件,并用它来取代原调用进程的数据段、代码段和堆栈段,在执行完之后,原调用进程的内容除了进程号外,...
  • C语言中更新文件

    千次阅读 2014-12-17 11:31:04
    根据文件在特定的系统中实现的方式不同,fopen的调用可能失败或者破坏文件中的内容。 更新文件最普遍的方法是:先写新数据到临时文件中,然后更新文件的整个内容之后,用临时文件替换原有文件。因此,如果希望编写...
  • C语言文件操作

    2020-05-24 20:54:37
    C语言中的文件操作都是通过调用标准函数来完成的。由于结构指针的参数传递效率更高,因此...每个文件都有自己的FILE结构和文件缓冲区,FILE结构中有一个curp成员,通过fp->curp可以指示文件缓冲区中数据存取的位置。
  • 如果当数据未充满缓冲区而程序结束运行,就有可能使缓冲区的数据丢失,要用fclose函数关闭文件,先把缓冲区数据输出到磁盘文件,然后才撤销文件信息区。有的编译系统在程序结束前会自动先将缓冲区数据写到...
  • C语言关于文件概述

    2016-10-12 14:45:13
    众所周知,数据存储是计算机的主要功能之一,各种数据包括文章,图像,数据库等都以二进制的形式...文件中数据是需要进行存取和处理的,一般对文件的操作可以通过以下两种方式进行:文件操作命令和文件系统功能调用
  • PYTHON调用C语言

    2019-01-22 11:43:35
    ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。 示例如下 实现两数求和的C代码,保存为add.c //sample ...
  • Python调用C语言

    2018-07-30 13:54:22
    ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。 示例如下 实现两数求和的C代码,保存为add.c   //sample C file to ...
  • 2.fgetc函数的功能是从指定的文件中读一个字符,函数调用的形式为: 字符变量=fgetc(文件指针); 例如: ch=fgetc(fp); 3.其意义是从打开的文件 fp 中读取一个字符并送入 ch 中。 对于 fgetc 函数的使...
  • C语言getutent()函数:从utmp文件中取得账号登录数据 头文件: #include 定义函数: struct utmp *getutent(void); 函数说明:getutent()用来从utmp 文件(/var/run/utmp)中读取一项登录数据, 该数据以utmp 结构...
  • C语言文件处理

    2013-07-12 16:08:00
    二进制文件是把内存数据按其在内存的存储形式原样输出到磁盘上存取。 一、文件的打开与关闭 ANSI C规定了标准输入输出函数库,用fopen()函数来实现打开文件。fopen函数的调用方式通常为:...
  • 调用main函数(main.c文件中的main函数由C语言编写)。setup.s源代码.text.global pm_mode.include "kernel.inc".code32.org 0pm_mode:movl $DATA_SEL, %eax #内核数据段选择符movw %ax, %dsmovw ...
  • 本文为大一时所写的文章(2017/4/19),文笔还很生疏,在很多...操作系统是以文件为单位进行管理,希望调用外存文件里的内容就得先去从外部存储找到文件名输入到缓冲区,从缓冲区再调入到内存,输出则是个逆过...
  • C语言——文件读写2

    2010-12-01 22:59:00
    二进制文件把内存数据按其在内存的存储形式原样输出到磁盘上存放,一个字节并不对应一个字符,不能直接输出字符形式。 <br />根据文件类型的不同,C语言文件的操作也不同。 <br /> 1. 字符...
  • Python调用C语言的实现

    2021-01-01 01:21:40
    ctypes模块提供了和C语言兼容的数据类型和函数来加载dll文件,因此在调用时不需对源文件做任何的修改。也正是如此奠定了这种方法的简单性。 示例如下 实现两数求和的C代码,保存为add.c //sample C file to add 2 ...
  • 写这篇博客的原因:之前我是用delphi7开发,在调用c版的dll接口时从没有出现过问题,后来升级为delphixe3版本开发时,出现一些令人头疼的问题,我费了很大劲才解决。 Delphixe3出现如下问题: 举个例子:dll文件...
  • 要读取一个类文件对象的数据,你需要重复调用 read() 方法,然后正确的解码获得的数据。 下面是一个C扩展函数例子,仅仅只是读取一个类文件对象的所有数据并将其输出到标准输出: #define CHUNK_SIZE 8192 /* ...
  • C语言文件系统编程

    2017-07-17 20:40:03
    在Linux,为了更好地保护内核空间,程序的运行空间分为内核空间和用户空间(也就是常称的内核态和用户态),它们分别运行在不同的级别上,在逻辑上是相互隔离的。因此,用户进程在通常情况下不允许访问内核数据,也...
  • C语言文件概述

    千次阅读 2016-11-01 21:23:33
    众所周知,数据存储是计算机的主要功能之一,各种数据包括文章,图像,数据库等都以二进制的形式...文件中数据是需要进行存取和处理的,一般对文件的操作可以通过以下两种方式进行:文件操作命令和文件系统功能调用
  • 当一段程序中调用scanf()函数时,会有数据经过键盘流入存储器,当调用printf()函数,会有数据从存储器流向屏幕。 流实际上就是一个字节序列,输入函数的字节序列被称为输入流,输出函数的字节序列称为输出流。 ...
  • 1.调用read DAT函数将学生信息录入 2.经调用sortDAT函数和calDAT函数将信息整理。 3.将整理完全的数据经print DAT函数打印出来以便观测是否准确,功能是否生效 4.将整理好的数据再次存入writeDAT函数 之后的程序大致...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼求如何改动才能将下列程序的存储输入或输出数据(或两者一起)到指定的文件(或运行时直接创立一个文件)如Arrangement。#include int n=0;int rest[7][7]; //全局声明,以...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,022
精华内容 408
关键字:

c语言调用文件中数据

c语言 订阅