如果.txt文件中存在某个单词,请将该单词复制到另一个txt文件

时间:2016-03-18 18:34:48

标签: c file

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

3 个答案:

答案 0 :(得分:3)

您使用错误的API打开文件。您使用的API - open - 用于基于描述符的低级访问。您将获得int值,而ifpofp将不正确。

您必须使用名为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(...) 查找字符串中是否存在子字符串。并且,通过已讨论的其他更改,使您的代码按照您的描述进行操作。