繁体   English   中英

如何获取C中文件中最长行的长度

[英]How to get the length of the longest Line in a File in C

这是我在这里的第一个问题,所以我感谢各种帮助。

我试图获取文件中最长行的长度,以便稍后调用它并读取整个文件。我的第一次尝试是动态的,但没有成功。

到目前为止,我的代码是:

FILE *inputData;
inputData = fopen("input.txt", "r");
char *input = NULL;
int longestLinelength = 0;
while(fscanf(inputData,"%[^\n]", input) != EOF) { 
    if(longestLineLength<strlen(input)){
        longestLineLength=strlen(input);
    }
}

fclose()

此代码 unfort.netly 导致 memory 访问错误。

size_t longestLine(FILE *fi)
{
    size_t largest = 0, current = 0;
    int ch;

    if(fi)
    {
        while((ch = fgetc(fi)) != EOF)
        {
            if(ch == '\n')
            {
                if(current > largest) largest = current;
                current = 0;
            }
            else
            {
                current++;
            }
        }
        if(current > largest) largest = current;
    }
    return largest;
}

我认为问题不在于 realloc,而在于对事物运作方式的误解。

最好仔细阅读scanf的作用。 以及指针是如何工作的。

input是一个 NULL 指针,而您想写入它,这会导致应用程序崩溃。 scanf需要分配的内存来写入,它不会自己分配。 通常我会建议使用fgets而不是 scanf 因为它更好处理。 scanf的格式化选项可以在你用fgets阅读它之后完成。

这可能是基于 The C Programming Language 一书的帮助。

首先我们需要一个main函数来获取文件中的行

int get_file_line(char line[], int maxline, FILE *fptr) {
    int ch, i;
    for (i = 0; i < (maxline - 1) && ((ch = getc(fptr)) != EOF) && (ch != '\n'); ++i) {
        line[i] = ch;
    } 

    if (ch == '\n') {
        line[i] = ch;
        ++i;
    }

    line[i] = '\0';
    return i;
}

然后我们将数据存储到一个新的字符数组中

void copy(char to[], char from[]) {
    int i = 0;
    while (from[i] != '\0') {
        to[i] = from[i];
        i++;
    }
    
}

最后在主函数中,我们将打开文件并使用之前的函数

FILE *ptr;
const char *file_name = "your_file.txt";

ptr = fopen(file_name, "r");
while ((len = get_file_line(line, MAXLINE, ptr)) > 0) {
    if (len > max) {
        max = len;
        copy(longest, line);
    }
}
fclose(ptr);

if (max > 0) {
    printf("longest: %s\n", longest);
    printf("len : %d\n", max);
}

全部一起

#include <stdio.h>
#define MAXLINE 1000 

int get_file_line(char line[], int maxline, FILE *fptr) {
    int ch, i;
    for (i = 0; i < (maxline - 1) && ((ch = getc(fptr)) != EOF) && (ch != '\n'); ++i) {
        line[i] = ch;
    } 

    if (ch == '\n') {
        line[i] = ch;
        ++i;
    }

    line[i] = '\0';
    return i;
}

void copy(char to[], char from[]) {
    int i = 0;
    while (from[i] != '\0') {
        to[i] = from[i];
        i++;
    }
    
}

int main() {
    int len, max = 0;
    char line[MAXLINE];
    char longest[MAXLINE];

    FILE *ptr;
    const char *file_name = "your_file.txt";


    ptr = fopen(file_name, "r");

    while ((len = get_file_line(line, MAXLINE, ptr)) > 0) {
        if (len > max) {
            max = len;
            copy(longest, line);
        }
    }

    fclose(ptr);

    if (max > 0) {
        printf("longest: %s\n", longest);
        printf("len : %d\n", max);
    }
    return 0;
}

我希望这可以帮到你

      #include <stdio.h>
    #include <string.h>
    
    #define MAX_LINE_LENGTH 4096
    
    static void process_file(char *filename);
    
    int main(int argc, char **argv) {
      int q;
    
      if(argc <= 1) {
        printf("Usage: %s <files>\n", argv[0]);
        return 1;
      }
    
      for(q = 1; q < argc; q++) {
        process_file(argv[q]);
      }
    
      return 0;
    }
    
    void process_file(char *filename) {
      char buf[MAX_LINE_LENGTH] = {0};
      FILE *file;
    
      char line_val[MAX_LINE_LENGTH] = {0};
      int line_len = -1;
      int line_num = -1;
      int cur_line = 1;
    
      file = fopen(filename, "r");
      if(file == NULL) {
        return;

  }

  while(fgets(buf, MAX_LINE_LENGTH, file) != 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++;
    /*printf("%s", buf);*/
  }

  fclose(file);

  if(line_num < 1) {
    return;
  }

  printf("%d:%s:%d:%s\n", line_len, filename, line_num, line_val);

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM