用结构体读取文件

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void)
{
struct data
{
char id[20];
char name[20];
char sex[10];
int old;
char number[20];
char habit[10];
char b[10];
int piao;
} student[10];
FILE *fp;
if((fp=fopen("shiyan.txt","r"))==NULL)
{
printf("File cannnot be open!");
exit(1);
}
int i=1;
char line[10][100];
while(!feof(fp))
{
fgets(line[i],100,fp);
if(strlen(line[i])>10)//有些行只含一个回车 当然不能作为一个结构体读取
{

sscanf(line[i],"%s %s %s %d %s %s %s %d\n",student[i].id,
student[i].name,
student[i].sex,
&student[i].old,
student[i].number,
student[i].habit,
student[i].b,
&student[i].piao);
i++;
}
}
fclose(fp);

int n;

printf("投票选手:");
scanf("%d",&n);
student[n].piao++;

if((fp=fopen("shiyan.txt","w"))==NULL)
{
printf("File cannot be open!");
exit(1);
}
printf("i=%d",i);
for(int j=1;j<i;j++)
{
fprintf(fp,"%s %s %s %d %s %s %s %d\n",student[j].id,
student[j].name,
student[j].sex,
student[j].old,
student[j].number,
student[j].habit,
student[j].b,
student[j].piao
);
}

fclose(fp);
return 0;
}

//文件shiyan.txy

//文件内容

id:1 朱逸文 男 20 201408091097 电脑 票数: 0
id:2 徐晓红 女 45 65643 烧饭 票数: 0
id:3 朱长才 男 50 66441231213 看书 票数: 0

//输入内容:2

//文件修改后的内容

id:1 朱逸文 男 20 201408091097 电脑 票数: 0
id:2 徐晓红 女 45 65643 烧饭 票数: 1
id:3 朱长才 男 50 66441231213 看书 票数: 0

总结:这是一个对文件部分内容进行修改的一个程序 而这种修改的思路

1:读取文件所有内容(需要修改和不需要修改的)到结构体中

2:用各种方法在结构体中定位需要修改的内容

3:在结构体中修改这部分内容

4:把修改后的结构体全部写入文件中

在这其中遇到的问题:

1:读取文件内容到结构体中 刚开始想的很单纯 用一个循环 while(!feof(fp)) 一个结构体一个结构体读 后面证明 这种方法有缺陷! 因为文件内容是其实我用另一个程序写进文件中的 其有固定的格式 值得注意的一点格式就是 每一行数据后面都有一个回车(这样可以使数据更直观)。但面对这种格式 用以上的读取就会出现问题 即:当读完

id:3 朱长才 男 50 66441231213 看书 票数: 1的时候。 其实 还没有到文件末尾 所有会再读取一个结构体 而这个结构体的内容只有一个回车 导致最后这个结构体内部的内容变成乱码。 后用fgets(line[i],100,fp);
                  if(strlen(line[i])>10);解决

这里引入一个Line的媒介,使那些只含回车 空格的一些无用内容就直接不读如结构中了 这样就避免的上面的问题。

时间: 2024-10-18 07:06:59

用结构体读取文件的相关文章

Demo02_对结构体进行文件读写_张仕传_作业_

#include <iostream> using namespace std; #define StructArrarySize 5 // 老师数量 #define StudentNum 3 // 每位老师的学生的数量 #define FileName "f:/1.txt" // 文件路径和名称 #define LineMaxLen 1024 // 每行最大长读 #define KeyMaxLen 20 // key的最大长度 typedef struct _AdvTea

保存结构体到文件

经常有这样一种需求,希望有些设置的信息(比如说账号信息)能够掉电后不丢失,重新开机后能够重新读出来.最简单的做法是把信息保存在文件中,文件在nand flash上就不会掉电丢失. 我们不仅可以向文件中写字符串,其实写结构体也是可以的.注意结构体里面不能有指针. 假设我们要保存一个账号结构体到文件, #include <stdio.h>#include <errno.h>#include <string.h>typedef struct _Account{ char us

几年前做家教写的C教程(之五专讲结构体与文件操作)

C语言学习宝典(5) 结构体: 将不同类型的数据组合成为一个有机的整体,这个整体就是一个结构体. 例如: Struct student { Int name; Char sex; Float score; }: 使用方法: 类型名 成员名: 一般形式: Struct { 成员列表: }变量名表列: 结构体变量的引用: 结构体变量名.成员名 文件: FILE  *fp; Fp=fopen(文件名,文件打开方式): Fclose(文件指针) 例1  对候选人得票的统计程序,设有3个后选人,每次输入一

cdev成员结构体file_operations文件操作结构的分析

struct file_operations{ struct module *owner; // 指向拥有该结构的模块的指针,避免正在操作时被卸载,一般为初始化为THIS_MODULES loff_t (*llseek) (struct file *, loff_t, int); // llseek用来修改文件当前的读写位置,返回新位置 // loff_t为一个”长偏移量”.当此函数指针为空,seek调用将会以不可预期的方式修改file结构中的位置计数器. ssize_t (*read) (st

c 结构体读取与保存

1.结构体保存到文本 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define max 3 5 6 typedef struct student{ 7 char name[10]; //最好用数组,方便,用指针到时写入到文本不好操作 8 int age; 9 int score; 10 }STU; 11 int size = sizeof(STU); 12 void write(

实验13——结构体、文件的基本应用

1. 本次课学习到的知识点: (1)结构类型是一种允许把一些数据分量聚合成一个整体的数据类型. (2)结构与数组的区别在于:数组中所有元素的数据类型必须是相同的,而结构中各成员的数据类型可以不同. (3) struct是定义结构类型的关键字,在struct之后,自行 命名一个结构名,它必须是一个合法的标识符. struct 结构名{ 类型名 结构成员名1; 类型名 结构成员名2; ··· 类姓名 结构成员名n; }; (4)在定义嵌套的结构类型时,必须定义成员的结构类型,再 定义主结构类型. (

C7_多结构体文件

.h // //  MyFunction.h //  C7_结构体多文件 // //  Created by dllo on 15/7/8. //  Copyright (c) 2015年 zhozhicheng. All rights reserved. // #import <Foundation/Foundation.h> // .h文件, 我们写函数的声明 // .m文件,写函数的定义 // 声明一个学生类型的结构体,用typedef设置 struct student{ int stu

读取文件中的数据(以结构体存放)

/* *读取文件中的数据(数据以结构体存放) */ #include<iostream> #include <fstream> //#define Field 31 //field_anal number #define Field 15 //field_post number using namespace std; //the level restore certain level data //level_z show the level struct Level { int

读取bin文件,并且按结构体赋值打印

目标:读取一个bin文件,并且将bin文件中的数据,按字节对齐赋值给结构体,并且打印出结构体的内容 目前思路是简单的先将bin文件数据一次性读到一个数组中,再将数组强制转换为结构体 char buff[256] FILE *fp; fp = NULL; fp = fopen(argv[1], "rb"); if (NULL == fp) { printf( "The file was not opened\n"); return; } fread(buff, 1,