Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将文件读入数组并跳过换行_C_Arrays_File Io_Newline - Fatal编程技术网

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

C 将文件读入数组并跳过换行,c,arrays,file-io,newline,C,Arrays,File Io,Newline,嘿,伙计们,我想读一个有多个换行符的文件,并将文件内容传输到一个数组中。例如: 文件: I want to Make This File Into An Array 文件将作为(伪代码)插入数组中: 我知道如何跳过空格和更改大小写,我一直在使用fscanf扫描文件并将字符输入数组 我的问题是 while(fscanf(f, "%s", array) != EOF) 到达换行符时中断。我到处寻找解决办法,但暂时找不到。感谢您的帮助 切勿在没有宽度的情况下使用转换说明符“%s

嘿,伙计们,我想读一个有多个换行符的文件,并将文件内容传输到一个数组中。例如:

文件:

I want to  
Make This  
File Into  
An Array  
文件将作为(伪代码)插入数组中:

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

我的问题是

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

到达换行符时中断。我到处寻找解决办法,但暂时找不到。感谢您的帮助

切勿在没有
宽度的情况下使用转换说明符
“%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);
}
#包括
#包括
#包括
#包括
枚举{BUFFER_GROWTH=4};
内部主(空)
{
char const*filename=“test.txt”;
文件*input=fopen(文件名,“r”);
如果(!输入){
fprintf(stderr,“无法打开\%s\”进行读取:(\n\n”,文件名);
返回退出失败;
}
尺寸长度=0;
尺寸=1;
char*buffer=malloc(大小*sizeof*buffer);
对于(int ch;(ch=fgetc(输入))!=EOF;){
if(!isprint((字符无符号)ch)| | isspace((字符无符号)ch))
继续;
如果(长度+1>=尺寸){
char*tmp=realloc(buffer,(size*=buffer\u GROWTH)*sizeof*buffer);
如果(!tmp){
自由(缓冲);
fclose(输入);
fputs(“内存不足:(”,stderr);
返回退出失败;
}
缓冲区=tmp;
}
缓冲区[length++]=tolower((字符无符号)ch);
}
缓冲区[长度]='\0';
放置(缓冲);
自由(缓冲);
fclose(输入);
}

逐字节读取文件并输入字母字符(请参见库函数
isalpha
)一个接一个地放入数组中。fscanf应该将换行符视为完全相同的空格。您的问题可能是,scanf在某个点返回0。请为所有类型的正确性投票,即使
char unsigned
确实伤害了我的眼睛:DNitpick:This
char*tmp=realloc…
可以“停留”一个
void*
.Nitpick^2:这个
=calloc(1,1);
更合适的方法是
=calloc(size,sizeof*buffer);
或者干脆
=malloc(size);buffèr[0]=0;
@alk Nitpik–benefit?–Nitpick^2–接受。也没有必要将其设置为零。“benefit”但主要是关于美观、风格的问题。
#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);
}