How to get ASCII code for characters from a text file?

南楼画角 提交于 2021-01-28 11:50:20

问题


Update, Hello guys Thank you all for the help, my initial approach was wrong and I did not use ASCII codes at all. Sorry for the late replay I had a half-day off today and made a new post for the complete code there is no errors but the prgram is not working proberly ( this is an update of old post ) I wrote the program, and it is working with no errors But it is not giving me the results I wanted

My only problem is when I read a character how to check its ASCII and store it.

#include <stdio.h>
#include <string.h>
int main()
{
 char dictionary[300];
 char ch, temp1, temp2;
 FILE *test;
 test=fopen("HW2.txt","r");
 for(int i=0;i<2000;i+=1)
  { ch=fgetc(test);
    printf("%c",ch);
  }
}

回答1:


If we are talking about plain ASCII, values goes from 0 to 127, your table shoud look like:

int dictionary[128] = {0};

Regarding your question:

how to check its ASCII and store it

Consider a char being a tiny int, they are interchangeable and you don't need any conversion.

fgetc wants an int in order to handle EOF, and trying to read 2000 characters from a file containing less than 2000 bytes can have very bad consequences, to read the whole file:

int c;

while ((c = fgetc(test)) != EOF)
{
    if ((c > 0) && (c < 128))
    {
        dictionary[c]++;
    }
}
for (int i = 1; i < 128; i++)
{
    if (dictionary[i] > 0)
    {
        printf("%c appeared %d times\n", i, dictionary[i]);
    }
}

EDIT:

Rereading, I see that you want to store words, not chars, ok, then it's a bit more difficult but nothing terrible, do not limit yourself to 300 words, use dynamic memory:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

// A struct to hold the words and the
// number of times it appears
struct words
{
    size_t count;
    char *word;
};

int main(void)
{
    FILE *file;

    file = fopen("HW2.txt", "r");
    // Always check the result of fopen 
    if (file == NULL)
    {
        perror("fopen");
        exit(EXIT_FAILURE);
    }
    
    struct words *words = NULL;
    size_t nwords = 0;
    char *word = NULL;
    size_t nchars = 1;
    size_t i;
    int c;

    // while there is text to scan
    while ((c = fgetc(file)) != EOF)
    {
        if (isspace(c))
        {
            if (word != NULL)
            {
                // Search the word in the table
                for (i = 0; i < nwords; i++)
                {
                    // Found, increment the counter
                    if (strcmp(word, words[i].word) == 0)
                    {
                        words[i].count++;
                        free(word);
                        break;
                    }
                }
                // Not found, add the word to the table
                if (i == nwords)
                {
                    struct words *temp;

                    temp = realloc(words, sizeof(*temp) * (nwords + 1));
                    if (temp == NULL)
                    {
                        perror("realloc");
                        exit(EXIT_FAILURE);
                    }
                    words = temp;
                    words[nwords].word = word;
                    words[nwords].count = 1;
                    nwords++;
                }
                // Prepare the next word
                word = NULL;
                nchars = 1;
            }
        }
        else
        {
            char *temp;

            temp = realloc(word, nchars + 1);
            if (temp == NULL)
            {
                perror("realloc");
                exit(EXIT_FAILURE);
            }
            word = temp;
            word[nchars - 1] = (char)c;
            word[nchars++] = '\0';
        }
    }
    for (i = 0; i < nwords; i++)
    {
        printf("%s appeared %zu times\n", words[i].word, words[i].count);
        free(words[i].word);
    }
    free(words);
    fclose(file);
    return 0;
}



回答2:


In C, characters are, essentially, their ASCII code (or rather, their char or unsigned char value). So once you read a character, you have its ASCII code already.

However, fgetc() doesn't always return the character it read for you; it may fail, for which reason it returns an int, not an unsigned char, which will be -1 in case of failure.

So:

  • You need to define an int variable to take the result of fgetc().
  • If it's not EOF, you can cast the result back into a unsigned char. That's your character, and it's ASCII value, at the same time.

PS - I'm ignoring non-ASCII characters, non-Latin languages etc. (But C mostly ignores them in its basic standard library functions too.)



来源:https://stackoverflow.com/questions/65454826/how-to-get-ascii-code-for-characters-from-a-text-file

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!