2010-03-31 83 views
1

我有一个文本文件,其中包含由空格分隔的单词。我想从文件中获取每个单词并存储它。所以我打开了这个文件,但我不确定如何将这个单词分配给一个字符。从C中的文本文件读取数据

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

回答

1

你不能持有一个char variable.It一个字必须是一个字符串或可以扩大一个字符指针。

试试这个;

char p [10]; //假定一个单词最多可以包含10个字符。

FILE * fp;

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

fscanf(fp,“%s”,p);

2

您无法将字指定给字符。您可以将一个字符分配给一个字符 - 因此名称。您可以将字指定给字符数组 - 例如s [128]。

例如:

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

注意,在生产代码,你不能只使用静态大小的缓冲区,这会导致缓冲区溢出利用的代码。

+0

你可以用'的fscanf(FP,“%127S” ,word);'在这种情况下避免缓冲区溢出。 – caf 2010-04-01 11:11:58

0

如果你想要更灵活一点 - 比如:通过选择识别单词的人物 - 你可以看看这个:

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

// adjust size for your needs 
#define MAX_WORD_LEN 1000 

static char *parseable_characters_str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy-"; 
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; 
}