我有一个看起来像这样的文件:
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来实现这个目标?
答案 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'。