将文件读入数组,并跳过换行符

时间:2019-02-23 19:34:14

标签: c arrays file-io newline

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

文件:

I want to  
Make This  
File Into  
An Array  

,该文件将作为(伪代码)插入数组:

array [] = iwanttomakethisfileintoanarray

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

我的问题是

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

在到达换行符时中断。我一直在寻找解决方案,但现在已经空了。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:2)

切勿在没有"%s"的情况下使用转换说明符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);
}
相关问题