如何用C语言文件操作修改指定文件 急.
如何使用C语言编写个,可提示输入一个字符串,然后将用户输入的字符串将某个指定文件的指定行数的一行信息给修改掉,急.
[解决办法]
#include <stdio.h>
#include <string.h>
void InsertLine(char* FileName,int L,char str[256])
{
int Lid=0;
int MaxLine=0;
FILE* fp=NULL;
char Buf[256]= " ";
char tmp[50][256]={0};
//char str[256]= "Good China\n ";
if( (fp=fopen(FileName, "r+ "))==NULL)
{
printf( "Can 't open file!\n ");
return;
}
while( fgets(Buf,256,fp) )
{
Lid++;
if(Lid==L)
strcpy(tmp[Lid++],str);
strcpy(tmp[Lid],Buf);
}
MaxLine=Lid;
rewind(fp);
for(Lid=1;Lid <=MaxLine;Lid++)
fputs(tmp[Lid],fp);
fclose(fp);
}
void cat(char *filepath)
{
int nl = 0;
FILE *stream;
char s[256];
char *p = s;
stream = fopen(filepath, "r+ ");
while((p = fgets(s, 256, stream)) != NULL)
{
nl++;
printf( "Line %d: %s ", nl, s);
}
fclose(stream);
}
void deleteLine(char* FileName,int lineno)
{
int Lid=0;
int MaxLine=0;
FILE* fp=NULL;
char Buf[256]= " ";
char tmp[20][256]={0};
char *p = Buf;
// char str[256]= "Good China\n ";
if( (fp=fopen(FileName, "r+ "))==NULL)
{
printf( "Can 't open file!\n ");
return;
}
while((p=fgets(Buf,256,fp))!=NULL)
{
Lid++;
if(Lid==lineno)
{
if((p=fgets(Buf,256,fp))!=NULL) // 原文多了个分号
{
strcpy(tmp[Lid],Buf);
}
}
else
strcpy(tmp[Lid],Buf);
}
MaxLine=Lid;
rewind(fp);
fclose(fp);
remove(FileName); // 删除原文件
if( (fp=fopen(FileName, "w "))==NULL)
{
printf( "Can 't open file!\n ");
return;
}
for(Lid=1;Lid <=MaxLine;Lid++) // 多写一行
fputs(tmp[Lid],fp);
fclose(fp);
}
int main()
{
cat( "1.txt ");
printf( "\n......................................................\n ");
InsertLine( "1.txt ",3, "7777\n ");
cat( "1.txt ");
printf( "\n......................................................\n ");
deleteLine( "1.txt ",3);
printf( "\n......................................................\n ");
cat( "1.txt ");
return 0;
}
[解决办法]
就要可以在C:\hello.c文件的第7行,写入一个数字串可以吗
============================
char num_string[10]={0}, tmp;
int line=1;
FILE *fp;
puts( "Input a number(string): ");
gets(num_string); //输入数字串, 比如 12345回车
fp=fopen( "C:\\hello.c ", "r+ "); //打开指定文件, 读写方式
while(line <7) //调整指针到第7行起始位置
{
tmp=fgetc(fp); //读取一个字符,如果是 换行,那么就到了下一行,如此累计7次
if(tmp == '\n ') line++; //文件指针就在文件的 7 行起始位置了
}
fputs(num_string, fp); //写入信息
... //其他程序内容
[解决办法]
FILE *fp=fopen( "hello.c ", "r+ ");
int linenum=0;
int len=0;
while(linenum <6)
{
if( 0x0a==fgetc(fp) )
linenum++;
}
while(0x0a!=fgetc(fp) )
{
len++;
}
fseek(fp,(-1)*len,1);
后面就可以写入一行
要注意长度不要超过len,否则要先把后面的内容保存,
不超过的会要把后面的内容提前
[解决办法]
我想lz是想不通过遍历文件来达到修改的目的. 我可以明确的告诉你: "不行 ".
如果你想修改指定行的内容,你只能先逐行读出之前的内容,然后原样写入新文件中,到了修改行地方,写入新的内容,然后再把原文件中剩下的内容写入新文件.没有其它方式.
当然,基于上面的做法前提下,你可以优化具体操作,比如到底是逐行读入,还是逐个字符读入,通过\n判断换行等等.
总之,我们面对的是顺序文件,这些文件是没法在不读入前面内容的情况下修改的.其实你想想就明白,文件是放在磁盘上的,如果你想修改某一行,必然导致文件尺寸发生变化,变大了的话,系统往哪里放啊,它原来放的空间可能就那么大,后面可能就是别的文件了.所以必须重新对其分配存储空间另外存储.
[解决办法]
C语言的文件视图有两种:文本或二进制。在Unix系统上,这两种视图的实现是一样的,即只有一种视图。至于你以何种视图操作文件,只跟你以何种方式打开这个文件有关,与其他无关,在C程序中,文件都是顺序的字节流。