我知道函数fseek()可用于将数据输出到文件中的特定位置。但我想知道我是否使用fseek()移动到文件的中间然后输出数据。新数据会覆盖旧数据吗?例如,如果我有一个包含123456789的文件,并且我使用fseek()在5之后输出newdata,那么该文件将包含12345newdata6789,或者它是否包含12345newdata。
答案 0 :(得分:5)
在文件的“中间”写入数据将覆盖现有数据。所以你会有'12345newdata'。
<小时/> 编辑:正如下面的评论中所提到的,应该注意这会覆盖数据而不会截断文件的其余部分。作为示例的扩展版本,如果您在包含newdata
的文件中的5
后面写了1234567890ABCDEFG
,那么您将拥有12345newdataCDEFG
,而不是 12345newdata
。
答案 1 :(得分:2)
是的,它可以让你这样做,这些文件被称为“随机存取文件”。想象一下,您已经有一个设置文件(结构但是空的),在这种情况下,您可以填充所需的“插槽”,或者如果插槽中填充了可以覆盖的数据。
typedef struct{
int number;
char name[ 20 ];
char lastname[ 20 ];
float score;
}students_t;
/* Supposing that you formatted the file already and the file is opened. */
/* Imagine the students are listed each one has a record. */
void modifyScore( FILE * fPtr ){
students_t student = { 0, "", "", 0.0 };
int nrecord;
float nscore;
printf( "Enter the number of the student:" );
scanf( "%d", &record )
printf( "Enter the new Score:" );
scanf( "%f", &nscore ); // this is a seek example so I will not complicate things.
/*Seek the file ( record - 1 ), because the file starts in position 0 but the list starts in 1*/
fseek( fPtr, ( record - 1 ) * sizeof ( students_t ), SEEK_SET );
/* Now you can read and copy the slot */
fread( fPtr, "%d%s%s%f", &student.number, student.name, student.lastname, &student.score );
/* Seek again cause the pointer moved. */
fseek( fPtr, ( record - 1 ) * sizeof ( students_t ), SEEK_SET );
student.score = nscore;
/*Overwrite his information, only the score will be altered. */
fwrite( &student, sizeof( student_t ), 1, fPtr );
}
这是它的工作原理(图片来自Deitel-How to program in C 6th Edition):
答案 2 :(得分:2)
您可能知道这一点,但fseek()
仅移动相关的位置指示器,并且本身并不指示正在进行的输出功能是否会覆盖或插入。
您可能正在使用fwrite()
或其他一些普通的输出函数,这些将覆盖,为您提供&#34; 12345newdata&#34;而不是插入的变体。
另一方面,你可以滚动你自己的插入功能(我不认为有这样的股票stdio.h
功能),并在之后调用fseek()
获得所需的插入内容。
这样的事情就足够了:
insert(const void *ptr, size_t len, FILE *fp) {
char tmp[len];
size_t tmplen;
while (len) {
// save before overwriting
tmplen = fread(tmp, 1, sizeof(tmp), fp);
fseek(fp, -tmplen, SEEK_CUR);
// overwrite
fwrite(ptr, len, 1, fp);
// reloop to output saved data
ptr = tmp;
len = tmplen;
}
}
(错误处理fread()
和fwrite()
遗漏了详细信息。)