将字符串写入C中的文本文件(文件开头的额外空格)

时间:2013-11-04 14:03:29

标签: c string file

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

输入字符串(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;
}

3 个答案:

答案 0 :(得分:0)

这是因为stdout 缓冲。要么为打印添加换行符,要么使用

显式刷新缓冲区
fflush(stdout);

你有这一行

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

这一行(两次,一次就够了)

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

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分: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," ");
    }
}