TODO:如果.txt文件中存在某个单词,请将该单词复制到另一个txt文件
问题:在“from.txt”到“to.txt”之后找不到该词。
错误:
这一行:while ((fscanf(ifp, "%s", line)) != EOF)
CODE:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAX_LINE 256
void main()
{
FILE *ifp;
FILE *ofp;
char line[MAX_LINE];
char word[MAX_LINE];
if ((ifp = open("from.txt", "r")) == NULL)
{
printf("Can't open input file.");
exit(1);
}
if ((ofp = open("to.txt", "w")) == NULL)
{
printf("Can't open output file.");
exit(1);
}
printf("Enter your word: ");
gets(word);
while ((fscanf(ifp, "%s", line)) != EOF)
{
if (strcmp(line, word) == 0)
{
fputs(line, ofp);
break;
}
}
fclose(ifp);
fclose(ofp);
getch();
}
答案 0 :(得分:3)
您使用错误的API打开文件。您使用的API - open
- 用于基于描述符的低级访问。您将获得int
值,而ifp
和ofp
将不正确。
您必须使用名为fopen
的基于流的API。它返回一个指向FILE
结构的指针,然后您可以将其传递给fscanf()
等。
非常重要:使用所有编译器警告编译此程序并观察输出。我很确定你已经从编译器获得了警告消息的日志。
答案 1 :(得分:1)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAX_LINE 256
void main()
{
FILE *ifp;
FILE *ofp;
char line[MAX_LINE];
char word[MAX_LINE];
//**************************************************************** it's fopen not open ***********************************************************
if ((ifp = fopen("from.txt", "r")) == NULL)
{
printf("Can't open input file.");
exit(1);
}
if ((ofp = fopen("to.txt", "w")) == NULL)
{
printf("Can't open output file.");
exit(1);
}
printf("Enter your word: ");
gets(word);
while ((fscanf(ifp, "%s", line)) != EOF)
{
if (strcmp(line, word) == 0)
{
fputs(line, ofp);
break;
}
}
fclose(ifp);
fclose(ofp);
getch();
}
工作正常......
答案 2 :(得分:1)
问题:在&#34; from.txt&#34;中发现该字后,它不会写字。 to&#34; to.txt&#34;。
正如评论和其他答案所述, and for other reasons ,open()
可能不是严格编写ANSI便携式代码的最佳选择。
但这不是所述问题的原因。
函数strcmp(...)
未执行所需操作
在这一行:
if (strcmp(line, word) == 0)
正在将一个单词与整行进行比较。而这个单词永远不会被识别出来。即使文件中的行出现只有一个单词,空格,例如空格,制表符或换行符(&#34;&#34;。\ n,\ t )会导致strcmp
的两个论点不相等。
strcmp(string1, string2) 可能的返回值为:
当string1 更大而不是string2时,正整数为
当string1 等于到string2时为零
当string1 小于 string2
函数strstr
会更合适。更改 strcmp 行以使用 strstr :
if (strstr(line, word)){...
strstr(...) 查找字符串中是否存在子字符串。并且,通过已讨论的其他更改,使您的代码按照您的描述进行操作。