簡體   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