【问题标题】:C: Parsing through an input file in order to check formattingC:解析输入文件以检查格式
【发布时间】:2017-09-05 02:13:22
【问题描述】:

我的目标是通读一个必须遵循这些格式规定的文本文件:

  1. 字符之间没有空格/制表符
  2. 字符必须是非负整数或换行符(无字母/符号)
  3. 我只能使用 stdlib.h 和 stdio.h 中给出的函数

我正在考虑使用fgetc() 函数逐个字符地读取文件,但我想不出一种方法来测试该字符是否为换行符(不是换行符/n,这将是两个字符在一起,这会破坏逐个字符的想法?)。

按照这个思路,我在想使用getline(),这将否定检查字符是否是换行符的必要性,会更容易(我的想法是对的还是这不会否定这样的要求?)。但是,如果我要这样做,那么遍历将产生的 char 字符串以仍然检查每个单独的字符的最简单方法是什么?

另外,如果有人能想到更简单的方法来使用给定的库检查文件的格式,那将不胜感激。

【问题讨论】:

  • if (c == '\n') 测试换行符
  • 很高兴知道 - 现在肯定会走 fgetc() 的路线。谢谢
  • 是的,但是一次读取一个字符而不是一次读取整个缓冲区会更慢。
  • 鉴于限制,您只需要检查您是否获得了数字或换行符。请记住,fgetc() 及其亲属返回的是 int,而不是 char。通常,您会使用来自<ctype.h> 的函数(例如isdigit()),但很容易解决不允许使用它们的事实。
  • @stackptr:不要忘记标准 I/O 缓冲输入,以便尽可能多地读取。速度差异通常很小。

标签: c


【解决方案1】:

如果您使用 getline,它将保留换行符,因此您仍然需要检查它。

如果您可以使用任何标准 C 库,那么您可以使用 ctypes.h 中的 isdigit(...)

如果输入字符是数字,则返回非零。

如果您使用 getline 函数,输入将被写入作为第一个参数传递的缓冲区。它会在此缓冲区中附加一个空终端字符,以便您可以这样遍历它:

for(char* s = buffer; *s; s++)
    /* test *s */

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-05
    • 1970-01-01
    相关资源
    最近更新 更多