找到文件C中的最短行

时间:2014-12-17 07:39:48

标签: c

到目前为止,我设法在这样的文件中获得最长的一行:

int LongestLine(FILE *filename) {

  char buf[MAX_LINE_LENGTH] = {0};

  char line_val[MAX_LINE_LENGTH] = {0};
  int line_len = -1;
  int line_num = -1;
  int cur_line = 1;

  filename = fopen(filename, "r");

  while(fgets(buf, MAX_LINE_LENGTH, filename) != NULL) {
    int len_tmp = strlen(buf) - 1;

    if(buf[len_tmp] == '\n')
      buf[len_tmp] = '\0';

    if(line_len < len_tmp) {
      strncpy(line_val, buf, len_tmp + 1);
      line_len = len_tmp;
      line_num = cur_line;
    }

    cur_line++;
  }

  return line_num;
}

然而,使用这种逻辑,找到最短的会略有不同。我不能写:if(line_len > len_tmp)。如何应用相同的逻辑但是要查找文件中的最短行?即使是伪代码也可以。

2 个答案:

答案 0 :(得分:2)

怎么样

int line_len = MAX_LINE_LEN+1;

一开始,请确保您阅读的第一行比“存储的”行短。最短的线长。

int LongestLine(FILE *filename) {

  char buf[MAX_LINE_LENGTH] = {0};

  char line_val[MAX_LINE_LENGTH] = {0};
  int line_len = MAX_LINE_LEN+1; //Set initial shortest line to big number.
  int line_num = -1;
  int cur_line = 1;

  filename = fopen(filename, "r");

  while(fgets(buf, MAX_LINE_LENGTH, filename) != NULL) {
    int len_tmp = strlen(buf); 

    if(len_tmp>0 && buf[len_tmp-1] == '\n') {
      buf[len_tmp-1] = '\0';
      --len_tmp;
    }

    if(len_tmp >0 && line_len > len_tmp) {  //On first pass that encounters a non-empty line this will always trigger because of the read limit in fgets.
      strncpy(line_val, buf, len_tmp + 1);
      line_len = len_tmp;
      line_num = cur_line;
    }

    cur_line++;
  }

  return line_num;
}

考虑更广泛的程序应该如何处理所有空白行的完全空文件或文件。 在这种情况下,该代码将返回MAX_LINE_LENGTH+1。这可能适合您的目的,也可能不适合。

此外,您还不清楚为什么要复制最短的一行及其行号。 你什么都不做,不能从函数中返回它们。 以下几行有什么好处?

      strncpy(line_val, buf, len_tmp + 1);

      line_num = cur_line;

答案 1 :(得分:0)

制造这样的条件。

if( line_num==-1)
    line_len=len_tmp;
else if ( len_tmp < line_len){
     line_num=len_tmp;
    // do the code for getting that line.}