【问题标题】:Reading a file into an array, and skipping newlines将文件读入数组并跳过换行符
【发布时间】:2019-02-23 19:34:14
【问题描述】:

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

文件:

I want to  
Make This  
File Into  
An Array  

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

array [] = iwanttomakethisfileintoanarray

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

我的问题是

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

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

【问题讨论】:

  • 逐字节读取文件,将字母字符(见库函数isalpha)一一放入数组中。
  • 那个 fscanf 应该将换行符与空格完全相同。您的问题可能是,scanf 在某个时候返回 0。

标签: c arrays file-io newline


【解决方案1】:

切勿使用没有width 的转换说明符"%s" 来限制写入目标的字符数。例如。 "%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);
}

【讨论】:

  • 赞成各种正确性,尽管 char unsigned 确实伤害了我的眼睛:D
  • 吹毛求疵:这个char *tmp = realloc ... 可以“留下”void*
  • Nitpick^2: 这个= calloc(1, 1); 最好是= calloc(size, sizeof *buffer); 或者只是= malloc(size); buffèr[0] = 0;
  • @alk Nitpik – 受益? – Nitpick^2 – 接受。也不需要将其设置为零。
  • "Benefit" 但主要是美观和风格的问题。
猜你喜欢
  • 2021-12-14
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 2011-08-18
  • 1970-01-01
相关资源
最近更新 更多