我有一个文本文件,其中包含由空格分隔的单词。我想从文件中获取每个单词并存储它。所以我打开了这个文件,但我不确定如何将这个单词分配给一个字符。从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
我有一个文本文件,其中包含由空格分隔的单词。我想从文件中获取每个单词并存储它。所以我打开了这个文件,但我不确定如何将这个单词分配给一个字符。从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
你不能持有一个char variable.It一个字必须是一个字符串或可以扩大一个字符指针。
试试这个;
char p [10]; //假定一个单词最多可以包含10个字符。
FILE * fp;
fp = fopen(“file.txt”,“r”);
fscanf(fp,“%s”,p);
您无法将字指定给字符。您可以将一个字符分配给一个字符 - 因此名称。您可以将字指定给字符数组 - 例如s [128]。
例如:
char word[128];
fscanf(fp, "%s", word);
注意,在生产代码,你不能只使用静态大小的缓冲区,这会导致缓冲区溢出利用的代码。
如果你想要更灵活一点 - 比如:通过选择识别单词的人物 - 你可以看看这个:
#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;
}
你可以用'的fscanf(FP,“%127S” ,word);'在这种情况下避免缓冲区溢出。 – caf 2010-04-01 11:11:58