日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

更改c语言程序保存地址吗,C语言文本文件实现局部修改

發布時間:2025/3/19 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 更改c语言程序保存地址吗,C语言文本文件实现局部修改 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:以往進行文件操作時,都是以鏈表(變量)作為用戶所見數據與文件數據之間的橋梁。用戶改變數據時,先改變鏈表(變量)中的數據,然后直接將整個鏈表重新寫入文件,以做到“實時同步”,非正常退出程序一般數據也不會丟失。但是數據量很大時,微小的改動就要重寫整個文件,浪費很多計算資源。但是在控制臺程序中,沒有C語言做不到的事,只有C語言不擅長的事。下面介紹一下文本文件的局部修改(覆蓋寫入)。當然,不進行覆蓋的話即實現了插入

先來回顧一下二進制文件(任意讀寫文件、隨機讀寫文件)的局部修改

下面這段程序向man.dat文件中寫入三個人的名字,年齡

typedef struct {

char name[20];

int age;

} Data;

int main(){

Data man[3];

for(int i = 0;i<3;i++){

printf("please input %c's name:",i+'A');

scanf("%s",man[i].name);

printf("please input %c's age:",i+'A');

scanf("%d",&man[i].age);

}

FILE *fp = fopen("man.dat","wb");

fwrite(man,sizeof(Data),3,fp);

fclose(fp);

return 0;

}

下面這段程序進行了二進制文件的任意讀寫

typedef struct {

char name[20];

int age;

} Data;

int main(){

FILE *fp;

char name[100];

printf("請輸入想要修改的人的名字:");

scanf("%s",name);

Data data;

fp = fopen("man.dat","r+");

while(fread(&data,sizeof(Data),1,fp)==1){

if(strcmp(data.name,name)==0){找到修改目標

printf("請輸入新的名字:");

scanf("%s",name);

strcpy(data.name,name);修改變量data的name,同樣這里也可以修改age

fseek(fp,-sizeof(Data),SEEK_CUR);指針移至修改目標前

fwrite(&data,sizeof(Data),1,fp);寫入新的data覆蓋原data

printf("修改成功\n");

break;

}

}

fclose(fp);

puts("開始讀取");

Data test;

fp = fopen("man.dat","r+");

while(fread(&test,sizeof(Data),1,fp)==1)

printf("%s %d\n",test.name,test.age);

return 0;

}

文本文件局部修改示例程序在文章末尾

前提條件

待修改數據的數據長度最好已知

修改后的數據長度要比原來小或相同,最好相同

具有寫入權限,文件打開方式為**r+**等

比如int類型的status字段表示該數據元素的使用狀態,用1表示正在使用,0表示閑置。現在有改變這個狀態的需求,那么這就非常符合本文所述的情況

主要流程

1.得到待修改的數據在文件中的位置

2.將文件內部指針定位到該位置

3.寫入新數據到文件

首先 我們對fscanf等函數的細節需要有一些了解

fscanf所讀數據間若存在換行符則讀取時文件指針會自動跳過換行符,

而無需在格式化字符串中加上換行符,且換行符占兩個字節(私以為是\r\n的緣故,ps:Windows環境下)

fscanf與scanf相似,數據間多余個空格(非格式化字符串間的空格)不造成讀取影響

文本文件又稱ASCLL碼文件,顧名思義我們可以計算出某些位置的字節數

說明:本文所述偏移字節數為ASCLL文件中的字節數,即字符數

得到待修改的數據在文件中的位置

假設當前有data.txt內容為

0 1 2

3 4 5

現在我們要得到5的位置

int num;

FILE *fp = fopen("data.txt","rt+");

while(fscanf(fp,"%d",&num)!=EOF&&num!=5);

讀取后文件指針指向5的后面

方法一

long ftell( FILE *stream );發生錯誤返回-1 利用ftell函數得到當前當前文件內部指針位置(相對文件首偏移字節數)

long position = ftell(fp);

position -= 待修改數據長度; 即得到要定位到的位置

方法二

int fgetpos( FILE *stream, fpos_t *position );fgetpos()函數保存給出的文件流(stream)的位置指針到給出的fpos_t類型的位置變量(pos)中.

(fpos_t在stdio.h中定義,實質上是一種__int64).fgetpos()執行成功時返回0,失敗時返回一個非零值 利用fgetpos獲得文件內部指針位置

fpos_t pos;

fgetpos(fp,&pos);

pos -= 待修改數據長度;

如果我們清晰的知道文件的存儲結構,比如它存儲的是大量相同的數據塊(就像二進制文件那樣),我們也可以遍歷計數,然后計算出偏移字節數

將文件內部指針定位到該位置

//經試驗,用于讀取的文件指針無法用于寫入

通過上述方法得到需要的文件指針位置(偏移字節數)后

接下來需要定位文件內部指針到該位置

int fseek( FILE *stream, long offset, int origin );

或者

int fsetpos( FILE *stream, const fpos_t *position );

feesk

其中,fseek函數中int origin參數的值應該是下列值其中之一

名稱

說明

SEEK_SET(0)

從文件的開始處開始

SEEK_CUR(1)

從當前位置開始

SEEK_END(2)

從文件的結束處開始

fessk從orign處開始,向后偏移offset個字節數,offset < 0 即向前移動

offset 參數為 fgetpos獲取到的fpos_t類型的pos也可,只需(long)pos

fsetpos

fsetpos用于將文件內部指針定位到pos,同理pos也可由ftell得到并轉換為fpos_t

示例

將上述data.txt中的5修改為0

fseek(fp,position,0);/#0 == SEEK_SET 從文件首開始

特別地你可以不需要用ftell獲得偏移字節數

fseek(fp,-待修改數值長度,SEEK_CUR);從當前位置開始

或者

fsetpos(fp,&pos);

//pos = (fpos_t) position;

//fset(fp,pos);

寫入新的數據到文件

fprintf照常寫入就好,此時會覆蓋原數據(注意換行符),但是此時要注意此時文件指針的位置,不要做多余的寫入,新數據長度不足要考慮用空格覆蓋原數據,由于fscanf格式化字符串的特點,再讀入時空格可以忽略。或者根據存儲方式與程序數據定義的特點進行適當的寫入

附上一些輸入流操作函數

rewind(FILE *stream);回滾指針到文件流首

feof(FILE *stream);判斷文件流是否到達文件尾,若到達返回一個非零值

FILE *freopen( const char *fname, const char *mode, FILE *stream );給一個已存在的流再分配一個不同的文件和方式(mode).在調用本函數后,給出的文件流將會用mode(方式)指定的訪問模式引用fname(文件名).

freopen()的返回值是新的文件流,發生錯誤時返回NULL.

fflush();

示例

下面的程序將三個結構體變量寫入man.txt文件

typedef struct{

char name[20];

int age;

}Data;

int main(){

Data man[3];

for(int i = 0;i<3;i++){

printf("please input %c's name:",i+'A');

scanf("%s",man[i].name);

printf("please input %c's age:",i+'A');

scanf("%d",&man[i].age);

}

FILE *fp = fopen("man.txt","w");

for(int i =0;i<3;i++){

fprintf(fp,"%s %d\n",man[i].name,man[i].age);

}

fclose(fp);

return 0;

}

運行及輸入

創建的文件

現在我們來修改第二行的16這個數據

修改程序如下

typedef struct{

char name[20];

int age;

}Data;

int main(){

FILE *fp = fopen("man.txt","r+");

Data data = {"liupeidong",16};//修改目標

char name[100];

int age;

while(fscanf(fp,"%s%d",name,&age)!=EOF){

if(strcmp(name, data.name) == 0 && age == data.age){找到目標

fseek(fp,-2,SEEK_CUR);回滾指針至16前

printf("please input new age:");

scanf("%d",&age);

fprintf(fp,"%d",age);覆蓋寫入

break;

}

}

fclose(fp);

return 0;

}

運行修改程序

我在Dev中打開了man.txt,然后使用程序修改了它,Dev的提醒

修改后的文件

2018/12/21更新

總結

以上是生活随笔為你收集整理的更改c语言程序保存地址吗,C语言文本文件实现局部修改的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。