关于fseek()函数的问题

qq_40669215 2018-03-03 04:22:31

比如第一个fseek将地址001变为了000,当一次循环后到了地址已经是00d了,为什么fseek后还是地址000而不是00c?
...全文
382 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2018-03-06
  • 打赏
  • 举报
回复
建议跟一下代码流程,你的while循环里有一处fscanf,这个操作会修改文件描述符的位置。 另外,fp1, fp2, list都是文件指针吗?
qq_40669215 2018-03-03
  • 打赏
  • 举报
回复
引用 1 楼 ckc 的回复:
rewind相当于回到文件头
但是rewind()里面不是fp1啊
ckc 2018-03-03
  • 打赏
  • 举报
回复
rewind相当于回到文件头
赵4老师 2018-03-03
  • 打赏
  • 举报
回复
为什么不用ftell函数获取当前位置呢? fseek Moves the file pointer to a specified location. int fseek( FILE *stream, long offset, int origin ); Function Required Header Compatibility fseek <stdio.h> ANSI, Win 95, Win NT For additional compatibility information, see Compatibility in the Introduction. Libraries LIBC.LIB Single thread static library, retail version LIBCMT.LIB Multithread static library, retail version MSVCRT.LIB Import library for MSVCRT.DLL, retail version Return Value If successful, fseek returns 0. Otherwise, it returns a nonzero value. On devices incapable of seeking, the return value is undefined. Parameters stream Pointer to FILE structure offset Number of bytes from origin origin Initial position Remarks The fseek function moves the file pointer (if any) associated with stream to a new location that is offset bytes from origin. The next operation on the stream takes place at the new location. On a stream open for update, the next operation can be either a read or a write. The argument origin must be one of the following constants, defined in STDIO.H: SEEK_CUR Current position of file pointer SEEK_END End of file SEEK_SET Beginning of file You can use fseek to reposition the pointer anywhere in a file. The pointer can also be positioned beyond the end of the file. fseek clears the end-of-file indicator and negates the effect of any prior ungetc calls against stream. When a file is opened for appending data, the current file position is determined by the last I/O operation, not by where the next write would occur. If no I/O operation has yet occurred on a file opened for appending, the file position is the start of the file. For streams opened in text mode, fseek has limited use, because carriage return–linefeed translations can cause fseek to produce unexpected results. The only fseek operations guaranteed to work on streams opened in text mode are: Seeking with an offset of 0 relative to any of the origin values. Seeking from the beginning of the file with an offset value returned from a call to ftell. Also in text mode, CTRL+Z is interpreted as an end-of-file character on input. In files opened for reading/writing, fopen and all related routines check for a CTRL+Z at the end of the file and remove it if possible. This is done because using fseek and ftell to move within a file that ends with a CTRL+Z may cause fseek to behave improperly near the end of the file. Example /* FSEEK.C: This program opens the file FSEEK.OUT and * moves the pointer to the file's beginning. */ #include <stdio.h> void main( void ) { FILE *stream; char line[81]; int result; stream = fopen( "fseek.out", "w+" ); if( stream == NULL ) printf( "The file fseek.out was not opened\n" ); else { fprintf( stream, "The fseek begins here: " "This is the file 'fseek.out'.\n" ); result = fseek( stream, 23L, SEEK_SET); if( result ) perror( "Fseek failed" ); else { printf( "File pointer is set to middle of first line.\n" ); fgets( line, 80, stream ); printf( "%s", line ); } fclose( stream ); } } Output File pointer is set to middle of first line. This is the file 'fseek.out'. Stream I/O Routines See Also ftell, _lseek, rewind ftell Gets the current position of a file pointer. long ftell( FILE *stream ); Function Required Header Optional Headers Compatibility ftell <stdio.h> <errno.h> ANSI, Win 95, Win NT For additional compatibility information, see Compatibility in the Introduction. Libraries LIBC.LIB Single thread static library, retail version LIBCMT.LIB Multithread static library, retail version MSVCRT.LIB Import library for MSVCRT.DLL, retail version Return Value ftell returns the current file position. The value returned by ftell may not reflect the physical byte offset for streams opened in text mode, because text mode causes carriage return–linefeed translation. Use ftell with fseek to return to file locations correctly. On error, ftell returns –1L and errno is set to one of two constants, defined in ERRNO.H. The EBADF constant means the stream argument is not a valid file-handle value or does not refer to an open file. EINVAL means an invalid stream argument was passed to the function. On devices incapable of seeking (such as terminals and printers), or when stream does not refer to an open file, the return value is undefined. Parameter stream Target FILE structure Remarks The ftell function gets the current position of the file pointer (if any) associated with stream. The position is expressed as an offset relative to the beginning of the stream. Note that when a file is opened for appending data, the current file position is determined by the last I/O operation, not by where the next write would occur. For example, if a file is opened for an append and the last operation was a read, the file position is the point where the next read operation would start, not where the next write would start. (When a file is opened for appending, the file position is moved to end of file before any write operation.) If no I/O operation has yet occurred on a file opened for appending, the file position is the beginning of the file. In text mode, CTRL+Z is interpreted as an end-of-file character on input. In files opened for reading/writing, fopen and all related routines check for a CTRL+Z at the end of the file and remove it if possible. This is done because using ftell and fseek to move within a file that ends with a CTRL+Z may cause ftell to behave improperly near the end of the file. Example /* FTELL.C: This program opens a file named FTELL.C * for reading and tries to read 100 characters. It * then uses ftell to determine the position of the * file pointer and displays this position. */ #include <stdio.h> FILE *stream; void main( void ) { long position; char list[100]; if( (stream = fopen( "ftell.c", "rb" )) != NULL ) { /* Move the pointer by reading data: */ fread( list, sizeof( char ), 100, stream ); /* Get position after read: */ position = ftell( stream ); printf( "Position after trying to read 100 bytes: %ld\n", position ); fclose( stream ); } } Output Position after trying to read 100 bytes: 100 Stream I/O Routines See Also fgetpos, fseek, _lseek, _tell

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧