到目前为止,我设法在这样的文件中获得最长的一行:
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)
。如何应用相同的逻辑但是要查找文件中的最短行?即使是伪代码也可以。
答案 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.}