1. c語言刪除文件中的指定的一行數據怎麼做
你平時應該有這樣的經歷,打開一個.txt格式的小說,在裡面刪除幾個字,系統反應卻很慢,這是為什麼呢?因為文件里的內容都是在硬碟上按順序一個位元組挨著一個位元組擺放的,讀取文件的時候,會從文件首地址一直讀到文件結束標記「-1」。如果能夠直接把文件裡面的幾個位元組刪掉,那麼下次這個文件怎麼讀呢?怎麼區分中間那幾個位元組被刪掉了呢?所以對於這些簡單的文件來說,要想直接刪除裡面的內容是不可能的。
一般有兩個方法實現這個功能:
1.把要保留的內容寫到另一個文件中,要刪掉的內容就不用寫了。
2.把要保留的內容存儲到一個字元串變數中,要刪掉的內容不用存儲,最後把這個字元串再寫回到原文件中覆蓋原來的內容。
常式:
#include<stdio.h>
structdata
{
intbianhao;
charfenlei[10];
charming[12];
intshijian[3];
floatjiage;
}
voiddel(intnum){//定義刪除指定編號的內容的函數
FILE*f1;//操作的文件
longlength;//文件總長度
char*f2;//用於記錄要保存的內容
chars[100];//用於保存每次讀取的一行內容
intn;//用於存儲編號
f1=fopen("data.txt","r");//以讀的方式打開文件
fseek(f1,0,2);//文件指針移到文件尾
length=ftell(f1);//取得文件長度
f2=(char*)malloc(sizeof(char)*length);//給f2分配文件長度的空間
*f2=0;//使得f2字元串的長度初始為0
rewind(f1);//文件指針回到文件頭
while(ftell(f1)<length-3){//當文件沒有結束時就依次讀取文件的每一行
fgets(s,100,f1);//讀取一行信息
n=atoi(s);//從讀取的信息取得編號
if(n==num)continue;//如果編號是要刪除的編號,就不用保存這一行信息了
strcat(f2,s);//保存讀取到的這一行信息
}
fclose(f1);//關閉文件
f1=fopen("data.txt","w");//重新以寫的方式打開文件
fputs(f2,f1);//把保存的信息重新存儲到文件當中
fclose(f1);//關閉文件
}
intmain(){
del(1);//調用上面定義的函數刪除指定編號的內容
del(3);//參數為編號
system("pause");//暫停一下
}
2. C語言中什麼函數可以修改文件內容(可以隨意刪除原內容的一部分)
C語言文件操作詳解
C語言中沒有輸入輸出語句,所有的輸入輸出功能都用 ANSI C提供的一組標准庫函數來實現。文件操作標准庫函數有:
文件的打開操作 fopen 打開一個文件
文件的關閉操作 fclose 關閉一個文件
文件的讀寫操作 fgetc 從文件中讀取一個字元
fputc 寫一個字元到文件中去
fgets 從文件中讀取一個字元串
fputs 寫一個字元串到文件中去
fprintf 往文件中寫格式化數據
fscanf 格式化讀取文件中數據
fread 以二進制形式讀取文件中的數據
fwrite 以二進制形式寫數據到文件中去
getw 以二進制形式讀取一個整數
putw 以二進制形式存貯一個整數
文件狀態檢查函數 feof 文件結束
ferror 文件讀/寫出錯
clearerr 清除文件錯誤標志
ftell 了解文件指針的當前位置
文件定位函數 rewind 反繞
fseek 隨機定位
# 文件的打開
1.函數原型
FILE *fopen(char *pname,char *mode)
2.功能說明
按照mode 規定的方式,打開由pname指定的文件。若找不到由pname指定的相應文件,就按以下方式之一處理:
(1) 此時如mode 規定按寫方式打開文件,就按由pname指定的名字建立一個新文件;
(2) 此時如mode 規定按讀方式打開文件,就會產生一個錯誤。
打開文件的作用是:
(1)分配給打開文件一個FILE 類型的文件結構體變數,並將有關信息填入文件結構體變數;
(2)開辟一個緩沖區;
(3)調用操作系統提供的打開文件或建立新文件功能,打開或建立指定文件;
FILE *:指出fopen是一個返迴文件類型的指針函數;
3.參數說明
pname:是一個字元指針,它將指向要打開或建立的文件的文件名字元串。
mode:是一個指向文件處理方式字元串的字元指針。所有可能的文件處理方式見表8.1
4.返回值
正常返回:被打開文件的文件指針。
異常返回:NULL,表示打開操作不成功。
例如:
//定義一個名叫fp文件指針
FILE *fp;
//判斷按讀方式打開一個名叫test的文件是否失敗
if((fp=fopen("test","r")) == NULL)//打開操作不成功
{
printf("The file can not be opened.\n");
exit(1);//結束程序的執行
}
要說明的是:C語言將計算機的輸入輸出設備都看作是文件。例如,鍵盤文件、屏幕文件等。ANSI C標准規定,在執行程序時系統先自動打開鍵盤、屏幕、錯誤三個文件。這三個文件的文件指針分別是:標准輸入stdin、標准輸出stdout和標准出錯 stderr。
* 文件的關閉
1. 函數原型
int fclose(FILE *fp);
2. 功能說明
關閉由fp指出的文件。此時調用操作系統提供的文件關閉功能,關閉由fp->fd指出的文件;釋放由fp指出的文件類型結構體變數;返回操作結果,即0或EOF。
3. 參數說明
fp:一個已打開文件的文件指針。
4. 返回值
正常返回:0。
異常返回:EOF,表示文件在關閉時發生錯誤。
例如:
int n=fclose(fp);
*文件的讀寫操作
A. 從文件中讀取一個字元
1. 函數原型
int fgetc(FILE *fp);
2. 功能說明
從fp所指文件中讀取一個字元。
3. 參數說明
fp:這是個文件指針,它指出要從中讀取字元的文件。
4. 返回值
正常返回: 返回讀取字元的代碼。
非正常返回:返回EOF。例如,要從"寫打開"文件中讀取一個字元時,會發生錯誤而返回一個EOF。
5. 實例
【例】顯示指定文件的內容。
//程序名為:display.c
//執行時可用:display filename1 形式的命令行運行。顯示文件filename1中的內容。例如,執行命令行display display.c將在屏幕上顯示display的原代碼。
//File display program.
#include <stdio.h>
void main(int argc,char *argv[]) //命令行參數
{
int ch;//定義文件類型指針
FILE *fp;//判斷命令行是否正確
if(argc!=2)
{
printf("Error format,Usage: display filename1\n");
return; //鍵入了錯誤的命令行,結束程序的執行
}
//按讀方式打開由argv[1]指出的文件
if((fp=fopen(argv[1],"r"))==NULL)
{
printf("The file <%s> can not be opened.\n",argv[1]);//打開操作不成功
return;//結束程序的執行
}
//成功打開了argv[1]所指文件
ch=fgetc(fp); //從fp所指文件的當前指針位置讀取一個字元
while(ch!=EOF) //判斷剛讀取的字元是否是文件結束符
{
putchar(ch); //若不是結束符,將它輸出到屏幕上顯示
ch=fgetc(fp); //繼續從fp所指文件中讀取下一個字元
} //完成將fp所指文件的內容輸出到屏幕上顯示
fclose(fp); //關閉fp所指文件
}
B. 寫一個字元到文件中去
1. 函數原型
int fputc(int ch,FILE *fp)
2. 功能說明
把ch中的字元寫入由fp指出的文件中去。
3. 參數說明
ch:是一個整型變數,內存要寫到文件中的字元(C語言中整型量和字元量可以通用)。
fp:這是個文件指針,指出要在其中寫入字元的文件。
4. 返回值
正常返回: 要寫入字元的代碼。
非正常返回:返回EOF。例如,要往"讀打開"文件中寫一個字元時,會發生錯誤而返回一個EOF。
5. 實例
【例】將一個文件的內容復制到另一個文件中去。
//程序名為:file.c
//執行時可用:file filename1 filename2形式的命令行運行,將文件filename1中的內容復制到文件filename2中去。
//file program.
#include <stdio.h>
void main(int argc,char *argv[]) //命令行參數
{
int ch;
FILE *in,*out; //定義in和out兩個文件類型指針
if(argc!=3) //判斷命令行是否正確
{
printf("Error in format,Usage: file filename1 filename2\n");
return; //命令行錯,結束程序的執行
}
//按讀方式打開由argv[1]指出的文件
if((in=fopen(argv[1],"r"))==NULL)
{
printf("The file <%s> can not be opened.\n",argv[1]);
return; //打開失敗,結束程序的執行
}
//成功打開了argv[1]所指文件,再
//按寫方式打開由argv[2]指出的文件
if((out=fopen(argv[2],"w"))==NULL)
{
printf("The file %s can not be opened.\n",argv[2]);
return; //打開失敗,結束程序的執行
}
//成功打開了argv[2]所指文件
ch=fgetc(in); //從in所指文件的當前指針位置讀取一個字元
while(ch!=EOF) //判斷剛讀取的字元是否是文件結束符
{
fputc(ch,out); //若不是結束符,將它寫入out所指文件
ch=fgetc(in); //繼續從in所指文件中讀取下一個字元
} //完成將in所指文件的內容寫入(復制)到out所指文件中
fclose(in); //關閉in所指文件
fclose(out); //關閉out所指文件
}
【例】按十進制和字元顯示文件代碼,若遇不可示字元就用井號"#"字元代替之。
//程序名為:mpf.c
//執行時可用:mpf filename1 形式的命令行運行。
// File mp program.
#include <stdio.h>
void main(int argc,char *argv[])
{
char str[9];
int ch,count,i;
FILE *fp;
if(argc!=2)
{
printf("Error format,Usage: mpf filename\n");
return;
}
if((fp=fopen(argv[1],"r"))==NULL)
{
printf("The file %s can not be opened.\n",argv[1]);
return;
}
count=0;
do{
i=0;
//按八進制輸出第一列,作為一行八個位元組的首地址
printf("%06o: ",count*8);
do{
// 從打開的文件中讀取一個字元
ch=fgetc(fp);
// 按十進制方式輸出這個字元的ASCII碼
printf("%4d",ch);
// 如果是不可示字元就用"#"字元代替
if(ch<' '||ch>'~') str[i]='#';
// 如果是可示字元,就將它存入數組str以便形成字元串
else str[i]=ch;
// 保證每一行輸出八個字元
if(++i==8) break;
}while(ch!=EOF); // 遇到文件尾標志,結束讀文件操作
str[i]='\0'; // 在數組str加字元串結束標志
for(;i<8;i++) printf(" "); // 一行不足八個字元用空格填充
printf(" %s\n",str); // 輸出字元串
count++; // 准備輸出下一行
}while(ch!=EOF); // 直到文件結束
fclose(fp); // 關閉fp所指文件
}
C. 從文件中讀取一個字元串
1. 函數原型
char *fgets(char *str,int n,FILE *fp)
2. 功能說明
從由fp指出的文件中讀取n-1個字元,並把它們存放到由str指出的字元數組中去,最後加上一個字元串結束符'\0'。
3. 參數說明
str:接收字元串的內存地址,可以是數組名,也可以是指針。
n: 指出要讀取字元的個數。
fp:這是個文件指針,指出要從中讀取字元的文件。
4. 返回值
正常返回:返回字元串的內存首地址,即str的值。
非正常返回:返回一個NULL值,此時應當用feof()或ferror()函數來判別是讀取到了文件尾,還是發生了錯誤。例如,要從"寫打開"文件中讀取字元串,將
發生錯誤而返回一個NULL值。
D. 寫一個字元串到文件中去
1. 函數原型
int fputs(char *str,FILE *fp)
2. 功能說明
把由str指出的字元串寫入到fp所指的文件中去。
3. 參數說明
str:指出要寫到文件中去的字元串。
fp:這是個文件指針,指出字元串要寫入其中的文件。
4. 返回值
正常返回: 寫入文件的字元個數,即字元串的長度。
非正常返回:返回一個NULL值,此時應當用feof()或ferror()函數來判別是讀取到了文件尾,還是發生了錯誤。例如,要往一個"讀打開" 文件中寫字元串時,
會發生錯誤而返回一個NULL值。
5.實例
【例】以下程序將一個文件的內容附加到另一個文件中去。
//程序名:linkfile.c
//執行時可用:linkfile filename1 filename2形式的命令行運行,將文件filename2的內容附加在文件filename1之後。
// file linked program.
#include <stdio.h>
#define SIZE 512
void main(int argc,char *argv[])
{
char buffer[SIZE];
FILE *fp1,*fp2;
if(argc!=3)
{
printf("Usage: linkfile filename1 filename2\n");
return;
}
// 按追加方式打開argv[1] 所指文件
if((fp1=fopen(argv[1],"a"))==NULL)
{
printf("The file %s can not be opened.\n",argv[1]);
return;
}
if((fp2=fopen(argv[2],"r"))==NULL)
{
printf("The file %s can not be opened.\n",argv[2]);
return;
}
// 讀入一行立即寫出,直到文件結束
while(fgets(buffer,SIZE,fp1)!=NULL)
printf("%s\n",buffer);
while(fgets(buffer,SIZE,fp2)!=NULL)
fputs(buffer,fp1);
fclose(fp1);
fclose(fp2);
if((fp1=fopen(argv[1],"r"))==NULL)
{
printf("The file %s can not be opened.\n",argv[1]);
return;
}
while(fgets(buffer,SIZE,fp1)!=NULL)
printf("%s\n",buffer);
fclose(fp1);
}
3. c語言如何做到把文本文件讀取操作後覆蓋原文件保存
先用r模式讀取文件內容並保存在適當的數組中,fclose。你可以修改其中的數據,然後用w模式讀取相同文件名,再寫入數據。
4. 請問高手,c語言下用什麼函數可以讀取從鍵盤輸入的任意文件路徑然後再打開該文件
可以運行後指定要打開的文件,成功運行
如我D盤下有f1.txt,沒有f3.txt
兩次運行結果分別是
一:
請輸入要打開的文件名(含路徑):
d:\f1.txt
成功打開文件d:\f1.txt!
Press any key to continue
二:
請輸入要打開的文件名(含路徑):
d:\f3.txt
打開文件失敗!
Press any key to continue
程序如下:
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 50
void main()
{
char* file=(char*)malloc(sizeof(char)*MAXSIZE);
printf("請輸入要打開的文件名(含路徑):\n");
gets(file);
FILE* fp;
if(!(fp=fopen(file,"r")))
{
puts("打開文件失敗!\n");
}
else
{
printf("成功打開文件%s!\n",file);
fclose(fp);
}
free(file);
}
5. c語言fwrite 覆蓋舊數據
不是的以外包打開會自動把文件以前的內容全部清空,再進行你寫的操作,並沒有覆蓋一說,如果不想覆蓋,就用ab追加模式,或者rb讀的模式
rb模式不會請數據,這時候寫數據才會發生那種數據覆蓋的情況
6. c語言編寫程序,完成把一個文件的內容復制到另一個文件中去。源文件的名字從鍵盤輸入,目的文件的名字也
#include <stdio.h>
int Copy_File(char* in_path,char* out_path)
{
FILE* in=NULL;
FILE* out=NULL;
if((in=fopen(in_path,"rb"))==NULL)
{
printf("無法打開源文件!\n");
return(1);
}
if((out=fopen(out_path,"wb+"))==NULL)
{
printf("無法創建目標文件!\n");
fclose(in);
return(1);
}
char data;
while(!feof(in))
{
if(1==fread(&data,sizeof(char),1,in))
fwrite(&data,sizeof(char),1,out);
}
fclose(in);
fclose(out);
return(0);
}
int main()
{
char in_path[256];
char out_path[256];
printf("請輸入源文件的路徑: ");
scanf("%s",in_path);
printf("請輸入目的文件的路徑: ");
scanf("%s",out_path);
if(Copy_File(in_path,out_path))
{
printf("拷貝失敗!");
}else
printf("拷貝成功!");
return(0);
}