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:Thischar*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);
}