在文件中读取前面的行(在C中)

时间:2016-02-14 19:26:42

标签: c file parsing

我有一个看起来像这样的文件:

This is the first line in the file

This is the third line in the file

我在文件中有一个空行(第2行)。我想逐行读取文件(我使用fgets执行),但是我想提前读取,检查文件中是否有空行。

但是,我的while fgets中有一个break语句,因为我的函数只是按函数调用一次读取文件。

所以如果我调用函数:

func(file);

它会读取第一行,然后中断。

如果我再次调用它,它会读取第二行然后中断等等。

因为我必须以这种方式实施,所以很难提前阅读,有什么方法可以实现这个目标吗?

这是我的代码:

int main(void) {
    FILE * file;

    if(file == NULL){perror("test.txt"); return EXIT_FAILURE;} 

    readALine(file);

}

void readALine(FILE * file) {

    char buffer[1000];

    while(fgets(buffer,sizeof(buffer),file) != NULL) {
        //Read lines ahead to check if there is a line
        //which is blank

        break; //only read a line each FUNCTION CALL
    }


}

所以要澄清一下,如果我一次读取整个文件(只有一个函数调用),它就会像这样(这很容易实现)。

int main(void) {
        FILE * file = fopen("test.txt","r");

        if(file == NULL){perror("test.txt"); return EXIT_FAILURE;}

        readALine(file);

    }

void readALine(FILE * file) {

    char buffer[1000];

    while(fgets(buffer,sizeof(buffer),file) != NULL) {

        if(isspace(buffer[0]) {
            printf("Blank line found\n");
        }
    }


}

但是因为我正在读取文件(逐行,每个函数调用),上面的第二段代码不起作用(因为我打破每行读取,我无法改变)。

我有没有办法用fseek来实现这个目标?

3 个答案:

答案 0 :(得分:1)

以无条件中断结束的while循环是一个if语句,所以我真的不明白你为什么使用while循环。我还假设你并不担心单行超过1000个字符。

continue语句跳转到循环的下一次迭代并再次检查条件。

login()

答案 1 :(得分:0)

你可以"提前阅读"只需将您的位置存储在文件中(使用#$var = cek('https://api.instagram.com/v1/tags/'.instagram_tag.'/media/recent?client_id='.intagram_clientid.'&count=2'); $var = get_curl('https://api.instagram.com/v1/tags/'.instagram_tag.'/media/recent?max_tag_id=11&min_tag_id=1&access_token='.intagram_token.'&callback=?'); $cek = json_decode($var); ),然后读取该行,如果这是一个空白行做任何您必须做的事情,最后返回到您所在的位置({{1} })。

希望这有帮助!

答案 2 :(得分:0)

readALine中的while循环读取行直到文件末尾。所以它会跳过空行和所有其他行。

如果您发现非空行,则可以在循环内返回:

while(fgets(buffer,sizeof(buffer),file) != NULL) {
    if (buffer[0] != '\n')
        return;
}

如果你还想跳过除空格之外什么都没有的行,你可以编写一个执行该检查的函数:

bool isNothingButWhitespace(char *s) {
    while (*s == ' ' || *s == '\n')
        s++;
    return *s == '\0';
}

这将找到第一个不是空格的字符。如果它是字符串终结符' \ 0'然后它将返回true(字符串只是空格)否则为falseS(找到了一些非空白字符)。

如果readALine中的while循环由于到达文件末尾而完成,则需要某种方式将其发送回调用方。我建议设置缓冲区[0] =' \ 0'。