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

up9lanfz  于 2022-12-26  发布在  其他
关注(0)|答案(3)|浏览(193)

这是我在这里的第一个问题,所以我感谢每一种帮助。
我试图获得文件中最长行的长度,这样我就可以稍后调用它并读入整个文件。我的第一次尝试是动态的,但没有成功。
到目前为止,我的代码是:

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()

不幸的是,这段代码会导致内存访问错误。

ggazkfy8

ggazkfy81#

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;
}
zujrkrfu

zujrkrfu2#

我认为问题不在于realloc,而在于对事物如何运作的误解。
最好仔细阅读一下scanf的作用,以及指针是如何工作的。
input是一个空指针,你想写入它,这会导致应用程序崩溃。scanf需要分配内存来写入,它自己不分配内存。通常我会建议使用fgets而不是scanf,因为它更好地处理。scanf的格式化选项可以在你用fgets读取它之后完成。

um6iljoc

um6iljoc3#

可能这个帮助是基于C编程语言这本书的。
首先,我们需要一个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++;
    }
    
}

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

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;
}

希望这对你有帮助

相关问题