void getS(char *fileName){
FILE *src;
if((src = fopen(fileName, "r")) == NULL){
printf("%s %s %s", "Cannot open file ", fileName, ". The program is now ending.");
exit(-1);
}
//char *get = " ";
int c = 1;
char ch = 'x';
while(ch!=EOF) {
ch = fgetc(src);
if(ch == '\n') c++;
}
fseek(src, 0, SEEK_SET);
int random = rand() % c;
int i = 0;
for(i = 0; i < random; i++){
while(ch != '\n'){
ch = fgetc(src);
}
}
do{
ch = fgetc(src);
if(ch != '\n' && ch != EOF){
printf("%c", ch);
}
}while(ch != '\n' && ch != EOF);
printf("%c", '\n');
fclose(src);
}
所以这是我的函数,它抓取文件并在文件中打印出一个随机字,如果每个单词都被一个新行分隔。
问题1: 为什么随机优先考虑前两个单词?
问题2:如何制作它以便我可以多次使用此功能而无需执行printf(“%c”,'\ n');因为如果我最后没有那个,那么之前的函数调用只会覆盖旧函数。
先谢谢,今天我一直在问一下感谢所有帮助stackoverflow! :)
P.S。使用srand(time(NULL));
答案 0 :(得分:2)
看看这里的逻辑:
for(i = 0; i < random; i++){
while(ch != '\n'){
ch = fgetc(src);
}
}
一旦你换了换行符,就不会再读取任何字符了,所以你总是要打印第一行或第二行。
你可以这样解决:
for(i = 0; i < random; i++){
ch = fgetc(src); // start by reading the first character on the line
while(ch != '\n'){
ch = fgetc(src);
}
}
Jim Balter还指出ch最好被声明为int。这是因为EOF不被视为常规字符。
答案 1 :(得分:0)
最后没有printf("%c","\n");
行,它工作正常......