C语言怎么对已写入文件中的数据加以修改
求教: C语言如何对已写入文件中的数据加以修改?
我想思路应该是,写入->读取->修改->再写入。但实现不知怎样做。我试了一下,但不行。麻烦看看问题何在。
//change data written in a file
#include <stdio.h>
#include <stdlib.h>
#define SIZE 41
#define MAX 81
struct person{
char name[SIZE];
unsigned short age;
char address[MAX];
char job[SIZE];
};
int main(void)
{
struct person info;
struct person rec;
struct person turnout;
FILE * fp;
long fl;
if((fp = fopen("info.dat","wb")) == NULL)
{
fprintf(stderr, "Error opening %s", "info.dat");
exit(EXIT_FAILURE);
}
printf("Name: ");
fgets(info.name, SIZE, stdin);
printf("\nAge: ");
scanf("%u", &info.age);
getchar();
printf("\nAddress: ");
fgets(info.address, SIZE, stdin);
printf("\nJob: ");
fgets(info.job, SIZE, stdin);
fwrite(&info, sizeof (struct person), 1, fp);
puts("\nOriginally:");
printf("Name: %s", info.name);
printf("\nAge: %u",info.age);
printf("\nAddress: %s", info.address);
printf("\nJob: %s", info.job);
fl = ftell(fp);
fseek(fp, fl-(long)sizeof(struct person), SEEK_CUR);
fread(&rec, sizeof (struct person), 1, fp);
puts("Rec:");
puts("\nNow:");
printf("Name: %s", rec.name);
printf("\nAge: %u",rec.age);
printf("\nAddress: %s", rec.address);
printf("\nJob: %s", rec.job);
printf("\nName: ");
fgets(rec.name, SIZE, stdin);
printf("\nAge: ");
scanf("%u", &rec.age);
getchar();
printf("\nAddress: ");
fgets(rec.address, SIZE, stdin);
printf("\nJob: ");
fgets(rec.job, SIZE, stdin);
fl = ftell(fp);
fseek(fp, fl-(long)sizeof(struct person), SEEK_CUR);
fwrite(&rec, sizeof (struct person), 1, fp);
fseek(fp, -(long)sizeof(struct person), SEEK_CUR);
fread(&turnout, sizeof (struct person), 1, fp);
puts("\nNow:");
printf("Name: %s", turnout.name);
printf("\nAge: %u",turnout.age);
printf("\nAddress: %s", turnout.address);
printf("\nJob: %s", turnout.job);
fclose(fp);
return 0;
}
------解决方案--------------------
------解决方案--------------------
unsigned int age;
scanf("%u", &info.age);
要是定义short 会报警告的
fwrite(&info, sizeof (struct person), 1, fp);
这个不支持直接写结构体吧 你不可以写4句吗 一个一个写进去 这句话有问题
------解决方案--------------------
内存对齐造成的
详情请看
http://bbs.****.net/topics/390209790
------解决方案--------------------
google, 看看别人如何操作文件的
------解决方案--------------------
所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。
我想思路应该是,写入->读取->修改->再写入。但实现不知怎样做。我试了一下,但不行。麻烦看看问题何在。
//change data written in a file
#include <stdio.h>
#include <stdlib.h>
#define SIZE 41
#define MAX 81
struct person{
char name[SIZE];
unsigned short age;
char address[MAX];
char job[SIZE];
};
int main(void)
{
struct person info;
struct person rec;
struct person turnout;
FILE * fp;
long fl;
if((fp = fopen("info.dat","wb")) == NULL)
{
fprintf(stderr, "Error opening %s", "info.dat");
exit(EXIT_FAILURE);
}
printf("Name: ");
fgets(info.name, SIZE, stdin);
printf("\nAge: ");
scanf("%u", &info.age);
getchar();
printf("\nAddress: ");
fgets(info.address, SIZE, stdin);
printf("\nJob: ");
fgets(info.job, SIZE, stdin);
fwrite(&info, sizeof (struct person), 1, fp);
puts("\nOriginally:");
printf("Name: %s", info.name);
printf("\nAge: %u",info.age);
printf("\nAddress: %s", info.address);
printf("\nJob: %s", info.job);
fl = ftell(fp);
fseek(fp, fl-(long)sizeof(struct person), SEEK_CUR);
fread(&rec, sizeof (struct person), 1, fp);
puts("Rec:");
puts("\nNow:");
printf("Name: %s", rec.name);
printf("\nAge: %u",rec.age);
printf("\nAddress: %s", rec.address);
printf("\nJob: %s", rec.job);
printf("\nName: ");
fgets(rec.name, SIZE, stdin);
printf("\nAge: ");
scanf("%u", &rec.age);
getchar();
printf("\nAddress: ");
fgets(rec.address, SIZE, stdin);
printf("\nJob: ");
fgets(rec.job, SIZE, stdin);
fl = ftell(fp);
fseek(fp, fl-(long)sizeof(struct person), SEEK_CUR);
fwrite(&rec, sizeof (struct person), 1, fp);
fseek(fp, -(long)sizeof(struct person), SEEK_CUR);
fread(&turnout, sizeof (struct person), 1, fp);
puts("\nNow:");
printf("Name: %s", turnout.name);
printf("\nAge: %u",turnout.age);
printf("\nAddress: %s", turnout.address);
printf("\nJob: %s", turnout.job);
fclose(fp);
return 0;
}
C
文件
数据
------解决方案--------------------
if((fp = fopen("info.dat","wb")) == NULL)
//改成,
if((fp = fopen("info.dat","wb+")) == NULL)
// 建议检查每个函数的返回值!
------解决方案--------------------
unsigned int age;
scanf("%u", &info.age);
要是定义short 会报警告的
fwrite(&info, sizeof (struct person), 1, fp);
这个不支持直接写结构体吧 你不可以写4句吗 一个一个写进去 这句话有问题
------解决方案--------------------
内存对齐造成的
详情请看
http://bbs.****.net/topics/390209790
------解决方案--------------------
google, 看看别人如何操作文件的
------解决方案--------------------
所谓修改删除文件a某位置的内容,其实是读打开文件a,再将‘a中修改删除位置之前的内容+修改删除的内容+a中修改删除位置之后的内容’保存到文件b,关闭文件a,删除文件a,将文件b改名为与之前文件a相同的名字,仅此而已。