这可能是一个非常愚蠢的问题(可能),但我正在使用fgets处理文本文件。没什么太花哨的:
while (fgets(buf, sizeof(buf), inputFile) != NULL)
这很有效,正如您所期望的那样。那么我的问题是,我的处理依赖于文件中的 next 行,但是我如何才能抓住下一行?
我发现它很棘手的原因是我仍然需要在fgets继续循环时单独处理下一行,但是当我在该行之前一行时,我的函数需要知道某个值是否出现在它之后的一行。
基本上,我不知道是否有办法在 fgets中执行其他fgets ,但是从当前位置开始?我怀疑没有,但我不确定如何实现它,因为当我仍然试图处理当前行时我不想跳到下一行,因为我在某些输入值sscanf并且我不想要覆盖它们。
如果没有意义,我会尽力澄清,但任何想法都会受到赞赏!
答案 0 :(得分:0)
您可以使用容量二的循环队列。用两行初始化队列。伪代码可能看起来像这样。
CircularQueue cq = CircularQueue(first_line, second_line);
while(true) {
if (check(cq[SECOND_ELEMENT])) {
process(cq[FIRST_ELEMENT]);
remove(cq[FIRST_ELEMENT])
append(cq, fgets(buf, sizeof(buf), inputFile))
} else {
break;
}
}
当然,因为我们已经知道我们想要一次处理两个元素,我们可以将指针保持为previous_element& current_element。 previous_element将指向您已读取的第二行,current_element将指向您已阅读的最后一行。
答案 1 :(得分:0)
我会做以下事情:
#include <stdio.h>
#include <stdlib.h>
char *getdata(char **buf, char **nextBuf, int bufsize, FILE *inFile )
{
char *ret;
static char *cBuf = NULL;
static char *nBuf = NULL;
static char *nRet = NULL;
static int bSize = 0;
if( cBuf ==NULL && nBuf==NULL && bufsize !=0 ) {
if( bufsize != 0 ) {
// allocate buffers and init them with first two lines of load.
bSize = bufsize;
cBuf = malloc( bSize );
nBuf = malloc( bSize );
if ( cBuf && nBuf ) {
if( (ret = fgets(cBuf, bSize, inFile)) != NULL ) {
*buf = cBuf;
// get next line ahead of time the first time we are called.
nRet = fgets(nBuf, bSize, inFile);
*nextBuf = (nRet==NULL)? NULL : nBuf;
}
}
}
else {
ret = NULL;
}
}
else if( cBuf==NULL && nBuf==NULL && bufsize == 0 ) {
// shutdown, cleanup
free( cBuf ); cBuf = NULL;
free( nBuf ); nBuf = NULL;
bSize = 0;
*buf = NULL;
*nextBuf = NULL;
ret = nRet = NULL;
}
else {
// set current line to the previously fetched next line
if( nRet ) {
char *tmp;
// swap buffers
tmp = cBuf;
cBuf = nBuf;
nBuf = tmp;
*buf = cBuf;
ret = nRet;
// now get the NEW next line
nRet = fgets(nBuf, bSize, inFile);
*nextBuf = (nRet==NULL)? NULL : nBuf;
}
else {
ret = nRet;
}
}
return ret;
}
int main(void)
{
char *buf = NULL;
char *nbuf = NULL;
while( getdata( &buf, &nbuf, 2048, stdin ) != NULL ) {
// process line. if needed, next line, if available is in nbuf
// (nbuf can be ptr to NULL if next line not present, be careful.)
printf( "%s", buf );
}
getdata( NULL, NULL, 0, NULL);
}