我在将字符串写入文本文件并从文件中读取时遇到问题。
输入字符串(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;
}
答案 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," ");
}
}