伙计们,我正在阅读其中包含多个换行符的文件,并将文件内容传输到数组中。例如:
文件:
I want to
Make This
File Into
An Array
,该文件将作为(伪代码)插入数组:
array [] = iwanttomakethisfileintoanarray
我知道如何跳过空格和更改大小写,并且我一直在使用fscanf扫描文件并将字符输入到数组中。
我的问题是
while(fscanf(f, "%s", array) != EOF)
在到达换行符时中断。我一直在寻找解决方案,但现在已经空了。任何帮助表示赞赏。
答案 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);
}