2010-08-02 40 views
2

gcc 4.4.4 c89文件指针和使用fgets

我正在阅读一个文件,并在该文件中,我必须在每一行上做一些操作。

在一个循环中,我调用了一个2个函数,它传递这个文件指针来对这个文件执行2个不同的操作。

但是,因为我正在使用fgets来读取该文本文件的一行。它会自动递增到下一行。所以对于第二个电话,它已经增加了。但是,我想在第一个函数的同一行上执行不同的操作。

FILE *fp = NULL; 
fp = fopen("devices.txt", "r"); 
for each line 
    get_devicename(fp); <-- calls fgets and operates on line 1, then increments to line 2 

    get_machine_code(fp); <-- calls gets and already on line 2, I need line 1 
end for 

为了解决问题,我创建了2个文件指针对象并将它们传递给函数。但是,将来我可能需要在此文本文件上执行更多操作。所以如果我不得不继续创建文件指针的实例,那么扩展性不是很好。

非常感谢您的任何建议,

回答

7

文件指针。先读线,然后将该行传递给您的get_XXX函数:

FILE *fp = NULL; 
char buf[4096]; 
fp = fopen("devices.txt", "r"); 
while(fgets(buf,sizeof buf,fp) != NULL) { 
    get_devicename(buf); 
    get_machine_code(buf); 
} 
2

更好地获得行作为一个字符串,然后再调用函数中使用此字符串来获取数据,而不是绕过

+0

相当。这个困难显示了程序设计的弱点。 – 2010-08-02 11:03:38

2

C文件提供了两个可为您执行此操作的函数集。使用ftell获取当前位置,并使用fseek返回到该位置。看到代码:

#include <stdio.h> 

int main() 
{ 
    FILE * pFile; 
    int pos; 

    pFile = fopen("devices.txt", "r"); 
    pos = ftell (pFile); 
    fgets(buf,sizeof(buf),pFile); 
    fseek (pFile , pos , SEEK_SET); 
    fgets(buf,sizeof(buf),pFile); 
    return 0; 
} 

而第二个选项是fgetposfsetpos。见代码:

#include <stdio.h> 

int main() 
{ 
    FILE * pFile; 
    fpos_t position; 

    pFile = fopen ("myfile.txt","w"); 
    fgetpos (pFile, &position); 
    fputs ("That is a sample",pFile); 
    fsetpos (pFile, &position); 
    fputs ("This",pFile); 
    fclose (pFile); 
    return 0; 
} 

但我宁愿只是读一次,然后你的文件内容传递给两个功能,而不是读两次。我想不出有任何理由要两次读取相同的数据。