0

我在将字符串写入文本文件并从文件中读取时遇到问题。

输入字符串 ( ) 正确char text1写入文件 ( input.txt) 并读取。但是我的结果文件有问题 - 字符串似乎可以正确写入文件,但是如果我看一下文件,文件开头的结果字符串之前有一个空格。如果我输入文本“ weather is weather”,那么在结果文件中我有这个 - “ weather is is weather”。结果字符串文本是可以的,唯一的问题是由于某种原因,结果文件的开头有一个空格。

当我使用此代码在屏幕上打印结果文件的内容时

while((ch2 = fgetc(result)) != EOF)
        printf("%c", ch2);

它什么都不打印,但是如果我打印text2字符串本身(不是从文件中),puts(text2);那么它会正确打印。

这个问题的原因可能是什么,我该如何解决?

这是整个程序:

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


int main()
{
    char text1[200], text2[200], words[20][100], *dist, ch1, ch2;
    int i, j, nwords=0;

    FILE *input, *result;

    input = fopen("input.txt", "w");

    if(input == NULL)
    {
        perror("Error opening the file.\n");
        exit(EXIT_FAILURE);         
    }

// Text input

    printf("\n Enter the text:\n\n   ");
    gets(text1);
    fputs(text1, input);
    fclose(input);


// Split string into words

    dist = strtok(text1, " ,.!?");
    i=0;
    while(dist!=0)
    {      
        strcpy(words[i],dist);
        dist = strtok(NULL, " ,.!?");
        i++;
        nwords++;                
    }


// Duplicating words that doesn't repeat in input string and copy them into tex2 string

    int flag_arr[20];
    memset(flag_arr, 0, 20);

    for(i=0; i <= nwords-1; i++)
    {
        for(j=0; j<=nwords-1; j++)
        {
            if(strcmp(words[i],words[j])==0)
            {
                flag_arr[i] += 1;
            }
        }
    }

    for(i = 0; i <=nwords-1; i++)
    {
        if(flag_arr[i] > 1)
        {
            strcat(text2," ");
            strcat(text2,words[i]);                              
        }
        else
        {
            strcat(text2," ");
            strcat(text2,words[i]);
            strcat(text2," ");
            strcat(text2,words[i]);
        }
    }

    result = fopen("result.txt", "w");

    if(result == NULL)
    {
        perror("Error opening the file.\n");
        exit(EXIT_FAILURE);         
    }

    fputs(text2, result);
    fclose(result);


// Rezultats

    fopen("input.txt", "r");
    if(input == NULL)
    {
        perror("Error opening the file.\n");
        exit(EXIT_FAILURE);         
    }
    fopen("result.txt", "r");
    if(result == NULL)
    {
        perror("Error opening the file.\n");
        exit(EXIT_FAILURE);         
    }

    printf("\n\n\n Input:\n\n   ");
    while((ch1 = fgetc(input)) != EOF)
        printf("%c", ch1);
//    puts(input);

    printf("\n\n\n Result:\n\n  ");
    while((ch2 = fgetc(result)) != EOF)
        printf("%c", ch2);   
//    puts(text2);

    fclose(input);
    fclose(result);

    getchar();
    return 0;
}
4

3 回答 3

1

这是因为stdout缓冲了。在打印中添加换行符,或显式刷新缓冲区

fflush(stdout);

你有这条线

input = fopen("input.txt", "w");

而这条线(两次,一次就够了)

fopen("input.txt", "r");

您实际上没有在任何地方重新分配input变量。这意味着当您尝试读取时,当您尝试input从只写文件句柄中读取时会收到错误(您不会报告)。

于 2013-11-04T14:05:37.697 回答
0

我意识到最初的问题已经很老了,但是我发现缺乏建议,并想留下一些对理解更有用的东西......你的程序最重要的问题是其他程序员没有解决的问题。您必须初始化 text2。您在没有先初始化 text2 的情况下将 strcat 与 text2 一起使用。换句话说,您将指针的内容与 text2 连接起来,但 text2 从来没有任何值,因此打印到屏幕(或文件)的内容被留下了垃圾。您的程序在刷新后工作的事实与刷新无关,而是与内存的随机效应有关。

char text1[20] = "";
char text2[20] = "";

解决了一半的问题。关于何时在单词之间放置空格的另一个问题是次要的。

for(i = 0; i <=nwords-1; i++)
{
    if(flag_arr[i] > 1)
    {
        strcat(text2,words[i]); // Check out the ordering here.
        strcat(text2," ");
    }
    else
    {
        strcat(text2,words[i]);
        strcat(text2," ");
        strcat(text2,words[i]);
        strcat(text2," ");
    }
}
于 2014-07-19T06:04:37.870 回答
0

关于您的陈述: 然后在结果文件中我有这个- “天气就是天气”。
在这个块中:

   else
    {
        strcat(text2," ");
        strcat(text2,words[i]);
        strcat(text2," ");
        strcat(text2,words[i]); //(change this to  strcat(text2,words[i+1]);)
    }

看起来你没有增加 i,所以会得到两次相同的单词,用空格分隔," ".

顺便说一句,这表明您的文件很好,而不是您在提取缓冲区后呈现缓冲区的方式是问题所在。

于 2013-11-04T14:49:59.153 回答