简体   繁体   English

在C中从文本文件读取数据

[英]Reading data from text file in C

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. 所以我打开了文件,但不确定如何将单词分配给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

You cannot assign a word to a char. 您不能将一个单词分配给char。 You can assign a single character to a char - hence the name. 您可以将一个字符分配给char-从而命名。 You can assign a word to an array of characters - such as s[128]. 您可以将一个单词分配给一个字符数组 -例如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. 注意,在生产代码中,您不能仅使用静态大小的缓冲区,这将导致缓冲区溢出可利用代码。

you can't hold a word in a char variable.It has to be a string or a char pointer that can be enlarged. 您不能在char变量中保留单词,它必须是字符串或可以扩大的char指针。

try this; 尝试这个;

char p[10]; 字符p [10]; //assuming that a word can have most 10 characters. //假设一个单词最多可以包含10个字符。

FILE *fp; 文件* fp;

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

fscanf(fp,"%s",p); 的fscanf(fp的, “%s” 时,P);

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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM