我需要编写一个程序来读取文件,然后将这些单词保存到链表中以供进一步使用。我决定使用fgetc逐个字符地读取文本,然后在每次检测到换行符('\n'
)或空格(' '
)时将所有内容保存到列表中,表示一个单词。
对不起,我是文件指针的新手,这是我到目前为止所得到的:
struct list { //global
char string[30];
struct list *next;
};
int main(void) {
FILE *filePtr;
char file[] = "text.txt";
char tempStr[30];
list *curr, *header;
char c;
int i = 0;
curr = NULL;
header = NULL;
if((filePtr = fopen(file, "r")) == NULL) {
printf("\nError opening file!");
getchar();
exit(101);
}
printf("\nFile is opened for reading.\n");
while(!EOF) {
while((c = fgetc(filePtr) != ' ') && (c = fgetc(filePtr) != '\n')) {
curr = (list*)malloc(sizeof(list));
//c = fgetc(filePtr);
tempStr[i] = fgetc(filePtr);
i++;
}
tempStr[i] = '\0';
strcpy(curr->string, tempStr);
curr->next = header;
header = curr;
i = 0;
}
while(curr!=NULL) {
printf("%s - ", curr->string); //This will not print.
curr = curr->next;
}
if(fclose(filePtr) == EOF) {
printf("\nError closing file!");
getchar();
exit(102);
}
printf("\nFile is closed.\n");
getchar();
getchar();
}
如果是文本文件:
have a nice day
期望的输出:
have - a - nice - day
但是,除了文件打开和关闭之外,我无法打印出任何内容。
感谢。
答案 0 :(得分:1)
宏EOF
的值为-1
,这是stdio.h
中定义的系统宏。文件读取API(fgetc
,fread
,fscanf
)一旦到达文件末尾将返回-1。因此,在您的程序中,while(!EOF)
这将始终为false,因为NOT
的{{1}}始终为0. -1
将以2的补码表示,因此该变量的所有位将为1.(如果-1
的大小为2,则int
将-1
存储为0xFFFF
变量中的int
。
使用以下示例代码。
while(EOF != (c = fgetc(filePtr)))
{
if ((c == ' ') || (c == '\n'))
{
if (i == 0)
{
continue;
}
tempStr[i] = '\0';
i = 0;
//here do your linklist node creation and insertion operation
continue;
}
tempStr[i] = c;
i++;
}
答案 1 :(得分:0)
这总是错误的:
while(!EOF)
查看内存分配代码。
curr = (list*)malloc(sizeof(list))
文件末尾的文件可能没有换行符。
while((c = fgetc(filePtr) != ' ') && (c = fgetc(filePtr) != '\n'))
答案 2 :(得分:0)
while(!EOF) {
这是一个始终为假的常量条件,所以你永远不会读任何东西。
您的代码还有其他问题,例如执行
curr = (list*)malloc(sizeof(list));
在循环中但在循环外使用curr。
答案 3 :(得分:0)
您应该使用您正在使用的任何函数来替换while条件来读取文件 - 您确定fgets的效率并不比这更高效吗?
IE将字符串读入比预期更大的缓冲区,然后将其复制到适当大小的缓冲区并将其附加到节点。
答案 4 :(得分:0)
扰流:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct list {
struct list *next;
char string[30];
};
int main(void) {
FILE *fp;
char file[] = "llist4.c";
/* in C you CANNOT omit the "struct keyword" from a declaration or definition. */
struct list *head=NULL, **pp= &head;
int ch; /* getc() returns an int */
size_t len ;
char buff[30];
fp = fopen(file, "r");
if (!fp) {
fprintf(stderr, "\nError opening file!");
exit(EXIT_FAILURE);
}
printf("\nFile has been opened for reading.\n");
for (len=0; len < sizeof buff; ) {
ch = fgetc(fp);
if (ch == EOF && !len) break;
if (ch == ' ' || ch == '\n' || ch == EOF) {
if (!len) continue;
buff[len] = '\0';
*pp = malloc(sizeof **pp);
if (!*pp) break;
strcpy((*pp)->string, buff);
(*pp)->next = NULL;
pp = &(*pp)->next ;
len=0; continue;
}
buff[len++] = ch;
}
if (len) {
fprintf(stderr, "\nWord was too large, or out of memory\n");
}
for( ;head; head= head->next) {
printf("%s - ", head->string);
}
if (fclose(fp) == EOF) {
fprintf(stderr, "\nError closing file!\n");
exit(EXIT_FAILURE);
}
printf("\nFile has been closed.\n");
exit(EXIT_SUCCESS);
}