Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在使用fgets()读取一行后移回上一行的起始位置?_C_File_Io - Fatal编程技术网

C 如何在使用fgets()读取一行后移回上一行的起始位置?

C 如何在使用fgets()读取一行后移回上一行的起始位置?,c,file,io,C,File,Io,例如,如果文件包含: 12345 -3445654 1245646 我想使用fgets()将第一行读入字符串。然后我也要读第二行,检查第一个点是否有'-'。如果有,我将阅读第二行,并将其读到第一行 然后我想再次使用fgets()读取第三行。这次当没有'-'时,我只想使文件返回到第三行的开头,以便下次调用fgets()时,它将再次读取相同的第三行 有什么方法可以做到这一点吗?使用fgetc读取下一行的第一个字符,如果它不是“-”,则使用ungetc将其放回。使用fgetc读取下一行的第一个字符,

例如,如果文件包含:

12345
-3445654
1245646
我想使用
fgets()
将第一行读入字符串。然后我也要读第二行,检查第一个点是否有
'-'
。如果有,我将阅读第二行,并将其读到第一行

然后我想再次使用
fgets()
读取第三行。这次当没有
'-'
时,我只想使文件返回到第三行的开头,以便下次调用
fgets()
时,它将再次读取相同的第三行


有什么方法可以做到这一点吗?

使用fgetc读取下一行的第一个字符,如果它不是“-”,则使用ungetc将其放回。

使用fgetc读取下一行的第一个字符,如果它不是“-”,则使用ungetc将其放回。

通常,您只需保持文件的一部分处于读取状态,直到你确定你不再需要它

或者,您可以将整个文件读入缓冲区,然后尽可能多地使用指针进行跳转


或者,如果您确实需要,您可以使用更多当前流位置,然后重新读取所需的部分。

通常,您只需将刚刚读取的文件部分保留在内存中,直到您确定不再需要它为止

或者,您可以将整个文件读入缓冲区,然后尽可能多地使用指针进行跳转

或者,如果您确实需要,您可以使用更多当前流位置,然后随时重新阅读所需的部分。

  • 读一行
  • 读第二行
  • 也许做一些涉及第一行和第二行的事情
  • 我通常要做的是声明第二行包含变量

    char prevline[whateversize];
    
    然后,在步骤1和步骤2之间的某个地方

    strcpy(prevline, line);
    
    (当然,您必须确保
    line
    prevline
    变量的分配是一致的,例如作为相同大小的数组,这样溢出就不会成为问题。)

    只要我愿意

  • 读一行
  • 读第二行
  • 也许做一些涉及第一行和第二行的事情
  • 我通常要做的是声明第二行包含变量

    char prevline[whateversize];
    
    然后,在步骤1和步骤2之间的某个地方

    strcpy(prevline, line);
    

    (当然,您必须确保
    line
    prevline
    变量的分配是一致的,例如作为相同大小的数组,因此溢出不是问题。)

    C的IO机制被有意地称为“stream”IO。如果输入看起来像下面这样,您希望发生什么(字符代表换行):
    12345/-3445654/-1245646
    ?或者,如果您读取的第一行以
    '-'
    开头,您希望能够在无法执行
    seek()
    操作的流上执行此操作吗?我不明白这个问题。您说“我想再次读取第三行”但是第一段没有说它读第三行,它只读第一行和第二行。如果你真的想回去,在读这行之前使用
    ftell()
    ,而不是使用
    fseek()
    回到你调用
    ftell()
    时的位置。C的IO机制称为“流”IO故意。如果输入看起来像以下内容(
    '/'
    字符表示换行):
    12345/-3445654/-1245646
    ,或者如果读取的第一行以
    '-'
    开头,您希望如何处理?您希望能够在无法执行
    搜索()的流上执行此操作吗
    operation?我不明白这个问题。你说“我想再读第三行”。但是第一段没有说它读第三行,它只读第一行和第二行。如果你真的想回去,在读这行之前使用
    ftell()
    ,而不是使用
    fseek()
    返回调用
    ftell()时的位置。
    如果不是“-”,而是查找选项卡“\t”在字符串的开头。单个ungetc是否也会将其放回原来的位置?或者,由于制表符占用许多空格,我必须多次取消etc。制表符字符只是一个字符。@Brandon:阅读函数的手册页!
    ungetch
    不保证取消设置超过一个字符。如果“-”,我查找选项卡“\t”“在字符串的开头。单个ungetc是否也会将其放回原来的位置?或者,由于制表符占用许多空格,我必须多次取消etc。制表符只是一个字符。@Brandon:阅读函数的手册页!
    ungetch
    不保证取消设置超过一个字符。