首页 > 解决方案 > 将文件读入数组并跳过换行符

问题描述

嘿伙计们,我正在寻找一个包含多个换行符的文件并将文件内容传输到一个数组中。例如:

文件:

I want to  
Make This  
File Into  
An Array  

并且该文件将作为(伪代码)插入到数组中:

array [] = iwanttomakethisfileintoanarray

我知道如何跳过空格和更改大小写,我一直在使用 fscanf 扫描文件并将字符输入到数组中。

我的问题是

while(fscanf(f, "%s",  array) != EOF) 

到达换行符时中断。我已经四处寻找解决方案,但现在一无所获。任何帮助表示赞赏。

标签: carraysfile-ionewline

解决方案


切勿使用"%s"没有 a的转换说明符width来限制写入目标的字符数。例如。"%99s"将 99 个字符读入 100 个数组。

scanf()使用只是为了摆脱空格逐字读取文件只会使事情变得复杂,因为tolower()无论如何您都必须对每个单词的每个字符进行处理。首先最好逐个字符地读取文件:

#include <stddef.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>

enum { BUFFER_GROWTH = 4 };

int main(void)
{
    char const *filename = "test.txt";
    FILE *input = fopen(filename, "r");
    if (!input) {
        fprintf(stderr, "Couldn't open \"%s\" for reading :(\n\n", filename);
        return EXIT_FAILURE;
    }

    size_t length  = 0;
    size_t size    = 1;
    char  *buffer  = malloc(size * sizeof *buffer);
    for (int ch; (ch = fgetc(input)) != EOF;) {
        if (!isprint((char unsigned) ch) || isspace((char unsigned) ch))
            continue;

        if (length + 1 >= size) {
            char *tmp = realloc(buffer, (size *= BUFFER_GROWTH) * sizeof *buffer);
            if (!tmp) {
                free(buffer);
                fclose(input);
                fputs("Not enough memory :(", stderr);
                return EXIT_FAILURE;
            }
            buffer = tmp;
        }

        buffer[length++] = tolower((char unsigned) ch);
    }
    buffer[length] = '\0';

    puts(buffer);

    free(buffer);
    fclose(input);
}

推荐阅读