1

I have a text file which contains words separated by space. I want to take each word from the file and store it. So i have opened the file but am unsure how to assign the word to a char.

FILE *fp;
fp = fopen("file.txt", "r");
//then i want
char one = the first word in the file
char two = the second word in the file

0

3 Answers 3

2

You cannot assign a word to a char. You can assign a single character to a char - hence the name. You can assign a word to an array of characters - such as s[128].

For instance:

     char word[128];
     fscanf(fp, "%s", word);

Note, in production code you cannot just use statically sized buffer, this will lead to buffer overflow exploitable code.

Sign up to request clarification or add additional context in comments.

1 Comment

You can use fscanf(fp, "%127s", word); to avoid the buffer overflow in this case.
1

you can't hold a word in a char variable.It has to be a string or a char pointer that can be enlarged.

try this;

char p[10]; //assuming that a word can have most 10 characters.

FILE *fp;

fp = fopen("file.txt","r");

fscanf(fp,"%s",p);

Comments

0

If you want a bit more flexible - for example: by choosing the characters that identify a word - you could have a look at this:

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

// adjust size for your needs
#define MAX_WORD_LEN 1000

static char *parseable_characters_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789-";
static char parseable_characters_tbl[256] = {0}; // lookup index table, stores yes/no -> allowed/not allowed

/*
* builds the lookup table
*/
void build_lookup_index(char *table, const char *str)
{
    int i;

    // init table to zero
    memset(table,0,256);

    // set value to 1 at ASCII-code offset of the array if the character is allowed to be
    // part of the word
    for (i=0; str[i]; i++)
        table[(unsigned char)str[i]] = 1;
}

/*
* returns unparsed bytes (kind of offset for next reading operation)
*/
int parse_buffer(char *buf, int size, const char *lookup_table)
{
    int i,l,s;
    char word[MAX_WORD_LEN+1];

    i = 0;
    l = 0;
    s = 0;

    while (i<size) {

        // character not in lookup table -> delimiter
        if (!lookup_table[buf[i]] || !buf[i]) {
            if (l >= MAX_WORD_LEN) {
                fprintf(stderr,"word exceeds bounds\n");
            }
            else if (l > 0) { // if word has at least 1 character...

                // append string-terminator
                word[l] = '\0';
                printf("word found (%d): '%s'\n",l,word);

            }

            // reset word length
            l = 0;

            // save last word offset
            s = i+1;
        }
        else {

            // prevent buffer overflows
            if (l < MAX_WORD_LEN)
                word[l] = buf[i];

            l++;
        }

        if (!buf[i])
            break;

        i++;
    }

    if (s > 0 && size-s > 0) {

        // move rest of the buffer to the start for next iteration step
        memmove(buf,buf+s,size-s);

        return size-s;
    }

    return 0;
}

int main(int argc, char *argv[])
{
    FILE *fh;
    char buf[1000]; // read buffer

    // "rb" because of Windows - we want all characters to be read
    fh = fopen("out.txt","rb");

    // initialize word index
    build_lookup_index(parseable_characters_tbl,parseable_characters_str);

    if (fh) {
        int r,off = 0;
        while (!feof(fh)) {
            r = fread(buf+off,1,sizeof(buf)-off,fh);
            off = parse_buffer(buf,r,parseable_characters_tbl);
        }
        fclose(fh);
    }

    return 0;
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.