【问题标题】:C: Count `new line` until double space is reachedC:计数`新行`直到达到双倍空格
【发布时间】:2012-11-25 04:11:11
【问题描述】:

基本上,我正在尝试从看起来像这样的文件中读取数据“块”

000000000
000000001
000100000
100000000

000000000
000000000
000000000  

上面的示例将转换为两个数据块。第一个是 4 行高,第二个是 3 行高。

双空格分隔“”。

这是我要阅读的代码,直到遇到双倍空格。 (这会读取第一个循环,然后我使用fseek 来读取我想读取的任何其他块 - 不过在这个问题中并不重要)

while(!endofblock){
  firstchar = fgetc(fptr); //read the first character
    if(firstchar == '\n'){ 
       if(fgetc(fptr) == '\n'){ //if its newline AND newline
          endofblock = 1; //end of block is reached, loops break
       }else{  //if its just one new line
          *h = *h + 1; //increment h (height), a pointer passed from elsewhere
       }
    }

  if(feof(fptr)){ 
    endofblock = 1; 
  }
}

这在大多数情况下都可以正常工作 - 但在某些复杂的无法解释的情况下它不起作用。此外,它非常臃肿和凌乱。

有没有更简洁、更好的方法来计算new line 的数量并在达到double new line 时停止计数?

【问题讨论】:

  • 逐行读取,然后拆分/解析读取的行 - 比逐字符读取要容易得多
  • @stackplasm no,通过使用getline 函数。
  • 请记住,gnu readline 要求您在项目中使用 gpl。 IMO,readline 的主要优点是对提示有用的 emacs 编辑和历史记录,但是当它用于从文件中读取时,这并不重要。 fgets 没有任何问题。

标签: c scanf fgetc


【解决方案1】:

使用getline函数:

char *line = NULL;
size_t linecap = 0;
ssize_t linelen;

while ((linelen = getline(&line, &linecap, fp)) > 0) {
    if (line[0] == '\n') {
        // block ended
    }
}

free(line);

【讨论】:

  • 此代码有效。这是完美的。但我不知道 size_t 是什么以及为什么 getline 的第二个参数是 linecap 的地址..
  • man getline 回答你所有的问题。简而言之,size_t 只是一个与指针大小相同的整数(就像long),而linecap 是在line 位置分配的内存量。
  • 也根据这个网站:dreamincode.net/forums/topic/…:“getline 在 ANSI 标准 C 中不存在。- fgets 可能并不完美,但它可能是所有标准功能中最安全的选择 " ....?
  • stackoverflow.com/questions/5565751/…(基本上,继续使用它,任何合理的最新编译器都会支持它)
猜你喜欢
  • 2016-02-27
  • 1970-01-01
  • 2019-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 2019-11-08
相关资源
最近更新 更多