我正在尝试完成将字符串与文本文件进行比较的家庭作业程序,因此用户基本上可以在文本文件中搜索文件中的搜索词(字符串)。我到了那里:)
然而今天我遇到了一个非常奇怪的问题。当它要求搜索的术语我输入文本时,它永远不会结束。我可以整天打字,它仍然要求输入。我忽略了什么奇怪的问题?新鲜的眼睛可能会有所帮助:)
/*
ask the user for a word
convert user word to LOWER CASE
open output file
open input file
test to be sure input file is open
search for target word and keep count --> how??
print results to monitor
write results to file
close files
*/
#include<stdio.h>
#include<stdlib.h>
int main (void)
{
//declare
int i =0;
int count = 0;
/*************************************************************
working with arrays and strings
*************************************************************/
char mystring[50]; //what user puts in
char target[50]; //the word in the file we are looking for
printf("input your message ");
scanf("%s", mystring);
//printf("%s", mystring);
/*************************************************************
find file, write to it, output the string, end and close file
**************************************************************/
//define text file to use
FILE *cfile;
//name of file == file
cfile = fopen("./thanksgiving_proclamation.txt", "a");
//error handling if file does not exist
if(cfile == NULL) printf("Cannot open file");
/*************************************************************
parse through file and search for string
**************************************************************/
//convert string to lowercase
for(i = 0; i < /*strlen(mystring)*/ 500; i++)//convert to string length
{
if(target[i] >= 'A' && target[i] <='Z')
//convert char between a and z into lowercase
target[i] = target[i] + 32; //makes uppercase char
}
//compare our strings
do{
//scan through file
fscanf(cfile, "%s", mystring);
//convert string to lowercase
for(i = 0; i < /*strlen(mystring)*/ 300; i++)//convert to string length
{
if(mystring[i] >= 'A' && mystring[i] <='Z')
//convert char between a and z into lowercase
mystring[i] = mystring[i] + 32; //makes uppercase char
}
if(strcmp(mystring, target) == 0)
count++;
}while(!feof(cfile));
//while(strcmp(target,"quit")!=0)//end loop
//print to file
fprintf(cfile, "%s", mystring);
//close file
fclose(cfile);
//show user file has been written
printf("\nSuccess. File has been written\n");
printf("Press Enter to Continue...");
getchar();
return 0;
}
答案 0 :(得分:2)
以附加模式打开文件:
cfile = fopen("...", "a");
然后你尝试从中读取。
fscanf(cfile, "%s", mystring);
首次尝试解决问题,我会尝试打开文件进行读取,在循环内读取文件并关闭文件。然后再次打开它,这次是为了添加mystring
那里(以及fclose
)。
一旦有效,如果你愿意,试着看看“阅读和追加模式”是否有效......
cfile = fopen("...", "a+");
答案 1 :(得分:1)
你不需要“&amp; mystring”,“mystring”已经是数组的地址。
最好使用gets或getline。
您正在将搜索字符串读入mystring,但之后您还将文件内容读入mystring。
答案 2 :(得分:0)
当你点击Enter
并且只将字符存储到空格时结束。
答案 3 :(得分:0)
我认为pmg已经遇到了实际问题;你已经在附加模式下打开了文件,根据我的H&amp; S副本,不允许从附加流中读取。您必须打开它“a +”(追加/更新)才能读取和来编写流。
在检查之前,您应该始终检查*scanf()
来电(fscanf()
,sscanf()
,scanf()
等)的结果是否成功 feof()
或ferror()
,你永远不应该使feof()
成为循环测试条件(因为在之后你试图读过去之前它不会返回true在文件的末尾,你的循环将总是执行一次太多次)。
我将你的循环改为:
for(;;)
{
if (fscanf(cfile, "%s", mystring) != 1)
{
if (feof(cfile))
{
fprintf(stderr, "Reached end of file!\n");
break; // exit loop
}
if (ferror(cfile))
{
fprintf(stderr, "Error while reading from file!\n");
break;
}
}
/**
* continue as before
*/
}