如何将文件中的字符存储到数组中

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 &gt;= 97 &amp;&amp; c &lt;= 122) || (c &gt;= 65 &amp;&amp; c &lt;= 90))。这应该适合你。 嘿,非常感谢!一个问题,为什么我的 printf (在我的 if 语句之前)除了行空间之外什么都不打印?我的变量 j 在整个循环中根本没有改变!我确保我的文本文件中包含字符,并且确实如此。为什么我的 j 不存储它们 删除 fscanf 语句中的空格:fscanf(file, "%c", &amp;j); 应该更好。 不幸的是,它没有帮助:(为什么这个 fscanf 不起作用:(我的文本文件有 abcdefgdidjoeinfoiwn3923829032 等。

以上是关于如何将文件中的字符存储到数组中的主要内容,如果未能解决你的问题,请参考以下文章

如何将 .txt 文件中的特定整数存储在结构数组中?

如何将文件中的值存储到数组中?

我们如何将数组从java传递到oracle中的存储过程

读取单词并将它们存储到数组中

C#获取并写入ORACLE数据库中中英文字符集问题

在java中如何把字节数组存储到数据库?