如何将文件中的字符存储到数组中
Posted
技术标签:
【中文标题】如何将文件中的字符存储到数组中【英文标题】:How to store characters from a file into an array 【发布时间】:2016-09-27 23:23:15 【问题描述】:请我在这方面遇到了很多麻烦。我有一个包含大量字符的文本文件,我需要通读每个字符,如果它是字母表中的一个字母,那么我需要将它存储在一个数组中。
到目前为止,我只是尝试将字符放入我的数组中,无论它是否是字母字符,但我的 fscanf 没有读取任何内容。
这是我的代码
char j = ' ';
int i;
FILE *file = fopen("text.txt", "r");
for(i = 0; i < 10; i++)
fscanf(file, " %c ", &j);
printf(" %c\n", j); //So I could see if j got anything BUT I'M NOT :(
if((j >= '97' && j <= '122') || (j >= '65' && j <= '90'))
fscanf(file, "%c", &array[i]);
fclose(file);
return 0;
我的结果?没有什么只是空格。是的,我的文本文件与我的 .c 文件位于同一文件夹中
帮助
我的问题:我的 fscanf 实际上没有读取任何内容。我的 j 变量永远不会改变!感谢下面的帮助者,我现在可以修复 ASCII 问题,但 fscanf 是我的主要问题,阻碍了我的进步
【问题讨论】:
请出示您的密码。 在循环中使用fgetc
。
并使用isalpha
。
Use a library -- they solve everything! ...哈,哈。 :)
欢迎来到 Stack Overflow。请尽快阅读About 和How to Ask 页面。我们将帮助您解决解决问题的诚实尝试,但我们通常不会从头开始编写代码。请阅读有关如何创建 MCVE (minimal reproducible example) 的信息,尽管您的代码很可能已经是有效的 MCVE。
【参考方案1】:
主要问题:
/* WRONG */
if((j >= '97' && j <= '122') || (j >= '65' && j <= '90'))
/* CORRECT */
if((j >= 97 && j <= 122) || (j >= 65 && j <= 90))
换句话说,表达式'A'
、'\0x41'
和65
在这种情况下都是等价的。
但“65”不是。这意味着字符“ASCII 6”和“ASCII 6”——这样的字符不存在:(
PS:
正如 Bluepixy 建议的那样,isalpha() 是您的朋友。我鼓励您在代码中替换 isalpha()
。
【讨论】:
嘿,非常感谢!一个问题,为什么我的 printf (在我的 if 语句之前)除了行空间之外什么都不打印?我的变量 j 在整个循环中根本没有改变!我确保我的文本文件中包含字符,并且确实如此。为什么我的 j 不存储它们【参考方案2】:您可以在此处修改代码,并通过 isalnum() 函数检查字符
char *readFileCharacter(char *fileName)
FILE *file = fopen(fileName, "r");
int c;
char *code;
size_t n = 0;
if (file == NULL)
return NULL; //impossible to open file
// Get the size of the file to allocate correctly the array of char
fseek(file, 0, SEEK_END);
long f_size = ftell(file);
fseek(file, 0, SEEK_SET);
code = malloc(f_size);
while ((c = fgetc(file)) != EOF)
if ( isalnum(c) ) // check if alphanum
code[n++] = (char)c;
fclose(file);
code[n] = '\0';
return code;
【讨论】:
嘿,这很酷,但对我来说都是非常先进的:(有没有更简单和更基本的方法可以为初学者做到这一点。也许使用 fscanf 或类似的东西。我在上面添加了我的代码,所以你可以看到我在什么级别 非常简单的代码,唯一的问题是您必须不知道文件的大小。然后分配是动态的,取决于文件的大小。您还可以将if ( isalnum(c) )
更改为if((c >= 97 && c <= 122) || (c >= 65 && c <= 90))
。这应该适合你。
嘿,非常感谢!一个问题,为什么我的 printf (在我的 if 语句之前)除了行空间之外什么都不打印?我的变量 j 在整个循环中根本没有改变!我确保我的文本文件中包含字符,并且确实如此。为什么我的 j 不存储它们
删除 fscanf 语句中的空格:fscanf(file, "%c", &j);
应该更好。
不幸的是,它没有帮助:(为什么这个 fscanf 不起作用:(我的文本文件有 abcdefgdidjoeinfoiwn3923829032 等。以上是关于如何将文件中的字符存储到数组中的主要内容,如果未能解决你的问题,请参考以下文章