C语言——从文本文件中读入及向文本文件中写入内容

1. 打开与关闭文件

头文件:<stdio.h>

用fopen函数打开数据文件

所谓“打开”是指为文件建立相应的信息区和文件缓冲区。
ANSI C规定了用标准输入输出函数fopen来实现打开文件:
用法:fopen(文件名,使用文件方式),如

fopen("a1","r");

fopen函数的返回值是指向a1文件的指针变量(即a1文件信息区的起始地址)。通常将fopen函数的返回值赋给一个指向文件的指针变量。如

FILE *fp;
fp=fopen("a1","r");

这样fp就和文件a1相联系了,或者说fp指向了文件。

使用文件的方式:

  • r: 只读方式,文件必须存在
  • w: 只写方式,若文件存在,则原有内容会被清除;若文件不存在,则会建立文件
  • a: 追加方式打开只写文件,只允许进行写操作,若文件存在,则添加的内容放在文件末尾;若不存在,则建立文件
  • +: 可读可写
  • b: 以二进制方式打开文件
  • t: 以文本方式打开文件(默认方式下以文本方式打开文件)

常见的组合:

  • r:
    以只读的方式打开文件,只允许读,此文件必须存在,否则返回NULL,打开成功后返回文件指针,位置指针指向文件头部
  • r+:
    以可读可写的方式打开文件,允许读写,此文件必须存在,否则返回NULL,打开成功后返回文件指针,位置指针指向文件头部
  • rb+:
    以可读可写、二进制方式打开文件,允许读写,此文件必须存在,否则返回NULL,打开成功后返回文件指针,位置指针指向文件头部
  • rt+:
    以可读可写、文本方式打开文件,允许读写,此文件必须存在,否则返回NULL,打开成功后返回文件指针,位置指针指向文件头部
  • w:
    以只写的方式打开文件,只允许写,若文件存在,文件中原有内容会被清除;若文件不存在,则创建文件,打开成功后返回文件指针,位置指针指向文件头部
  • w+:
    以读写的方式打开文件,允许读写,若文件存在,文件中原有内容会被清除;若文件不存在,则创建文件,打开成功后返回文件指针,位置指针指向文件头部
  • a:
    以追加、只写的方式打开文件,只允许写。若文件存在,则追加的内容添加在文件末尾,若文件不存在,则创建文件。打开成功后返回文件指针,位置指针指向文件头部(注意很多书上或资料上讲述追加方式打开成功后位置指针指向文件末尾是错误的)
  • a+:
    以追加、可读写的方式打开文件,允许读写。若进行读操作,则从头开始读;若进行写操作,则将内容添加在末尾。若文件不存在,则创建文件。打开成功后返回文件指针,位置指针指向文件头部。

常用文件打开方式:

if((fp=fopen("file1","r"))==NULL){
    printf("cannot open this file\n");
    exit(0);
}

用fclose函数关闭数据文件

用法:fclose(文件指针),如

fclose(fp);

关闭文件的目的是防止结束程序时数据丢失。因为向文件写数据时,是先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件,当数据未充满缓冲区时程序结束运行,有可能使缓冲区的数据丢失。
用fclose函数关闭文件时,会先把缓冲区中的数据输出到磁盘文件,然后才撤销文件信息区。
fclose函数也带回一个值,当成功的执行了关闭操作,则返回为0,否则返回EOF(-1)。

2. 对文件进行读写

printf和scanf函数向终端进行格式化的输入输出。
fprintf和fscanf函数向文件进行格式化的输入输出。

用fscanf从文件进行读入数据

用法:fscanf(文件指针,格式化字符串,出入表列),如:

fscanf(fp,"%d,%f",&i,&f);

用fprintf将数据写入文件

用法:fprintf(文件指针,格式化字符串,输出表列),如:

fprintf(fp,"%d,%6.2f",i,f)

3. 读写字符

用fgetc从文件读出字符

用法:fgetc(fp),从fp指向的文件读入一个字符,读成功带回所读字符,失败则返回文件结束标志EOF

用fputc将字符写入文件

用法:fputc(ch,fp),把字符ch写到文件指针变量fp所指向的文件中,输出成功返回值就是输出的字符,输出失败则返回EOF。

在访问磁盘文件时,是逐个字符(字节)进行的,每访问完一个字节后,当前读写位置自动后移。为了知道对文件读写是否完成,即检测文件尾标志是否已被读取过(文件的所有有效字符后有一个文件尾标志,用标识符EOF表示)。用feof函数可检测文件尾标志是否被读取过,若已读过,返回值为1,否则为0。

4. 读写字符串

用fgets从文件读出字符串

用法:fgets(str,n,fp);
即从fp指向的文件读入一个长度为(n-1)的字符串(最后加一个’\0’),存放到字符数组str中,返回值为地址str或NULL。
如果读完字符串之前遇到’\n’或EOF,读入结束,’\n’也作为一个字符读入。

用fputs将字符串写入文件

用法:fputs(str,fp);
即把str所指向的字符串写到文件指针变量fp所指向的文件中。
输出成功,返回0,否则返回非0值

5. 用二进制方式向文件读写一组数据

用fread从文件中读出一组数据

用法:fread(buffer,size,count,fp);
从文件读入count个size大小的数据项,放在地址buffer中。

用fwrite将一组数据写入文件

用法:fwrite(buffer,size,count,fp);
把从地址buffer开始的存储区中的数据向文件输出。

在读写时以二进制形式进行的,向磁盘写数据时,直接将内存中一组数据原封不动、不加转换的复制到磁盘文件上。
fread或fwrite函数的类型为int型,如果执行成功,则返回值为形参count的值,即输入或输出数据项的个数。

6. 关于文件位置标记的函数

rewind函数

rewind函数使文件位置标记指向文件开头,无返回值。
用法:rewind(文件指针类型),如:

rewind(fp)

fseek函数

用法:fseek(文件类型指针,位移量,起始点),如

fseek(fp,100L,0);//将文件位置标记向前移到离开头100个字节处
fseek(fp,50L,1); //将文件位置标记向前移到离当前位置50个字节处
fseek(fp,-10L,2); //将文件位置标记从末尾处向后退10个字节

7. 例程

#include<stdio.h>
#include<stdlib.h>
void main(){
	//打开文件
	FILE *fp;
	fp=fopen("data.txt","a+");    //data文件的位置请注意
	if(fp==NULL)
    {
        printf("error\n");
        exit(0);                  //exit在头文件stdlib.h中
    }

	//从data文件读入数据
	int year=0,lon=0,lat=0;
	double pre=0;//年份 经度 纬度 降雨量
	fscanf(fp,"%d %d %d %lf",&year,&lon,&lat,&pre);
	year++;
	//向data文件写入数据
	fprintf(fp,"\n%d %d %d %.2lf",year,lon,lat,pre);
	
	//从data文件读入字符
	rewind(fp);
	char c;
	c=fgetc(fp);
	//向data文件写入字符,需要先rewind一下
	rewind(fp);
	fprintf(fp,"\n");
	if(fputc(c,fp)==EOF){
		printf("\nerror");
		exit(0);
	}

	//从data文件读入字符串
	fseek(fp,3L,0);            //将文件位置标记向前移到离开头3个字节处
	char A[8];
	fgets(A,8,fp);             //获得长度为7(即8-1)的字符串
	//向data文件输出字符串
	rewind(fp);
	fprintf(fp,"\n");
	fputs(A,fp);

	//关闭文件
	fclose(fp);
}

data.txt文件的原内容:
原内容
程序运行后,data.txt的内容为:
在这里插入图片描述

  • 14
    点赞
  • 119
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Mac OS X 10.15 下源码安装 mysql-8.0.20-macos10.15-x86_64 https://my.oschina.net/kinglyphp/blog/4281112 博客地址 下载mysql-8.0.20-macos10.15-x86_64.tar.gz 可以从mysql官网下载,如果比较慢, 从https://download.csdn.net/download/long4512524/12427861 下载 解压 tar zxvf mysql-8.0.20-macos10.15-x86_64.tar.gz 移动解压后的二进制包到安装目录 sudo mv mysql-8.0.20-macos10.15-x86_64 /usr/local/mysql 在 /usr/local/mysql 目录新建 data目录文件 cd /usr/local/mysql sudo mkdir data 更改 mysql 安装目录所属用户与用户组 cd /usr/local sudo chown -R root:wheel mysql 在启动 mysql 之前,我们先需要指定my.cnf 文件 因为 mysql 5.7 版本开始 my-default.cnf 文件不会自带,需要手动创建。 cd /usr/local/mysql/support-files sudo vi my-default.cnf 在 /usr/local/mysql/support-files 目录下创建 my-default.cnf [mysqld] basedir = /usr/local/mysql datadir = /usr/local/mysql/data port = 3306 socket = /usr/local/mysql/data/mysql.sock log-error = /usr/local/mysql/data/mysqld.log [client] socket=/usr/local/mysql/data/mysql.sock 拷贝my-default.cnf到/etc/my.cnf sudo cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf 初始化 mysqld cd /usr/local/mysql sudo bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data 其: basedir 是指你的mysql安装在哪儿了。 (具体需要换成你自己的路径) datadir 是指MySQL后续的数据存放在哪儿。(具体需要换成你自己的路径) 注意: 这儿执行完会生成mysql root账号的密码,后面在客户端连接时,5.7版本需要用到,自己别忘了记录下 类似这种: 其 Wt#GeUu_q2oJ 就是root的密码。 [Note] A temporary password is generated for root@localhost: Wt#GeUu_q2oJ 启动MYSQL cd /usr/local/mysql sudo support-files/mysql.server start 如下: kingly@192 data % cd /usr/local/mysql kingly@192 mysql % sudo support-files/mysql.server start Starting MySQL . SUCCESS! 对应mysqld 启动起来接口 ps aux | grep mysqld 见到如下所示,证明mysql安装成功。 kingly@192 mysql % ps aux | grep mysqld kingly 40915 0.6 0.0 4285708 724 s000 S+ 5:47下午 0:00.00 grep --color=auto mysqld _mysql 40907 0.4 2.1 4907248 350300 s000 S 5:46下午 0:00.95 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/mysqld.log --pid-file=/usr/local/mysql/data/192.168.0.103.pid --socket=/usr/local/mysql/data/mysql.sock --port=3306 使用 之前的记住的 Wt#GeUu_q2oJ的密码,测试mysql的链接情况 /usr/local/mysql/bin/mysql -uroot -P3306 -p kingly@192 bin % /usr/local/mysql/bin/mysql -uroot -P3306 -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.20 Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 修改root密码,并为 PASSWORD EXPIRE NEVER 永不过期 mysql> alter user 'root'@'localhost' identified by '12345678' PASSWORD EXPIRE NEVER; mysql> flush privileges; mysql> quit; 设置远程访问 允许root用户在任何地方进行远程登录,并具有所有库任何操作权限。 如果出现 提示”Access denied for user ‘root’@’localhost’ (using password: YES)” mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select user,host from user; +------------------+-----------+ | user | host | +------------------+-----------+ | epass | % | | epass | localhost | | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +------------------+-----------+ 6 rows in set (0.00 sec) mysql> 发现root只有本地权限, 那么, 我们需要给root 加上 127.0.0.1,% 还有指定服务器ip访问的权限, 注意: mysql版本8.0.13,在给新用户授权时,发生了变化 如果出现, 不能直接使用 grant all privileges on *.* to root@'%' identified by '12345678'; //给mysql用户分配远程访问权限 会出现, You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by "12345678"' at line 1 的错误,原因是新版本mysql版本把将创建账户和赋予权限分开了。 应该如下操作: mysql> use mysql; mysql> create user 'root'@'%' identified by 'password'; mysql> grant all privileges on *.* to 'root'@'%' with grant option; mysql> flush privileges; 如果使用 Navicat连接MySQL Server8.0版本时出现Client does not support authentication protocol requested by server; 解决办法: mysql> use mysql; mysql> alter user 'root'@'localhost' identified with mysql_native_password by '12345678'; mysql> flush privileges; 如上即可。 加入环境变量,编辑 /etc/profile,这样可以在任何地方用mysql命令了 sudo vi ~/.bash_profile 添加 export PATH=$PATH:/usr/local/mysql//bin 使~/.bash_profile环境变量生效 source ~/.bash_profile 这个就可以在 任何地方用 mysql 命令了。 mysql -uroot -p 启动、重启与停止,状态 启动 sudo /usr/local/mysql/support-files/mysql.server start 重启 sudo /usr/local/mysql/support-files/mysql.server restart 停止 sudo /usr/local/mysql/support-files/mysql.server stop 查看状态 sudo /usr/local/mysql/support-files/mysql.server status
可以使用 fopen() 函数打开文本文件,使用 fgets() 函数逐行读取文件内容,再使用 strtok() 函数解析每行数据,并将其与链表的数据匹配。如果找到匹配项,可以使用 free() 函数删除该节点。具体实现可以参考以下示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> struct Node { char data[100]; struct Node *next; }; void deleteNode(struct Node **head_ref, char *key) { struct Node *temp = *head_ref, *prev; if (temp != NULL && strcmp(temp->data, key) == 0) { *head_ref = temp->next; free(temp); return; } while (temp != NULL && strcmp(temp->data, key) != 0) { prev = temp; temp = temp->next; } if (temp == NULL) return; prev->next = temp->next; free(temp); } void printList(struct Node *node) { while (node != NULL) { printf("%s\n", node->data); node = node->next; } } void insertNode(struct Node **head_ref, char *new_data) { struct Node *new_node = (struct Node*) malloc(sizeof(struct Node)); strcpy(new_node->data, new_data); new_node->next = (*head_ref); (*head_ref) = new_node; } int main() { FILE *fp = fopen("input.txt", "r"); char line[100]; struct Node *head = NULL; // Read file and insert data into linked list while (fgets(line, 100, fp)) { strtok(line, "\n"); insertNode(&head, line); } fclose(fp); // Traverse linked list and delete node if data matches deleteNode(&head, "data to be deleted"); // Print remaining linked list printList(head); return 0; } ``` 请注意,此示例代码仅用于演示如何从文本文件读取数据并操作链表,并不保证在所有情况下都能正常工作。实际开发需要根据具体需求适当修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不白学

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值