резюме: система («очистить»); не работает хорошо.
Я использую gcc, версию ubuntu 18.04 LTS для программирования на c.
я намеревался «прочитать каждое слово и распечатать из двух текстовых файлов. После завершения чтения файла задержать 3 секунды и стереть терминал»
поэтому я сделал два текстовых файла и использовал system("clear"); стереть терминал.
вот весь код.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
void printFiles(char *file1,char *file2,char *change1, char *change2){
FILE *f;
char *text = malloc(sizeof(char)*100);
f=fopen(file1,"r");
system("clear");
//while(!feof(f)){
while(EOF!=fscanf(f,"%s",text)){
//fscanf(f,"%s", text);
printf("%s ",text);
//usleep(20000);
}
//sleep(3);
fclose(f);
printf("\n");
//all comment problems are appear here. and if I give delay, such as usleep() or sleep, delay also appear here. Not appear each wrote part.
f=fopen(file2,"r");
//while(!feof(f)){
while(EOF!=fscanf(f,"%s",text)){
if (strcmp(text,"**,")==0){
strcpy(text,change1);
strcat(text,",");
}
else if (strcmp(text,"**")==0){
strcpy(text,change1);
}
else if (strcmp(text,"##.")==0){
strcpy(text,change2);
strcat(text,".");
}
else if (strcmp(text,"##,")==0){
strcpy(text,change2);
strcat(text,",");
}
printf("%s ",text);
//usleep(200000);
}
fclose(f);
free(text);
sleep(3); //here is problem. This part works in the above commented part "//all comment problems are appear here."
system("clear"); //here is problem. This part works in the above commented part "//all comment problems are appear here."
}
int main(){
char file1[100] = "./file1.txt";
char file2[100] = "./file2.txt";
char change1[100] = "text1";
char change2[100] = "text2";
printFiles(file1,file2,change1,change2);
return 0;
}
Мне очень жаль, имена файлов и переменных изменены из-за политики. Кроме того, содержимое файла также не может быть загружено.
Я не могу найти, какая часть прерывает Процедурно-ориентированное программирование. Я думаю, что это была ошибка компилятора, потому что использование одного файла read and system(clear); работает хорошо.
Я также создаю две точечные переменные, такие как 'FILE *f1; ФАЙЛ *f2; f1=fopen(файл1); f2=fopen(file2)...`, но результат тот же.
Это ошибка компилятора? Если это так, что я должен сделать для решения этой проблемы? Спасибо.
с использованием версии gcc: gcc (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0 Copyright (C) Free Software Foundation, Inc., 2017 г. Это бесплатное программное обеспечение; см. источник условий копирования. НЕТ гарантии; даже не для КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.
@yang Что этот комментарий должен прояснить?
'система ("очистить");' не действует, когда функция завершилась, действует 'fclose()';
извините, я исправлю комментарий
Вы должны проверить возвращаемое значение fopen
Вы хотите сказать, что system("clear") не работает?
Вы должны использовать strscpy (возможно, вам придется кодировать его самостоятельно), если только вы не знаете наверняка многое о строках, используемых strcpy. Если вы не хотите использовать strscpy, подумайте хотя бы об использовании strlcpy (из libbsd) или strncpy (стандартно)
То же самое с strcat, что и с strcpy.
@ЕвгенийШ. да. Похоже плохо работает
В <stdio.h> есть макрос под названием FILENAME_MAX. Вы должны использовать это вместо магического числа 100
В malloc вы должны использовать sizeof(*text) вместо sizeof(char) для (маловероятного) случая, когда вы меняете тип данных text.
@CacahueteFrito да, это был прототип всего кода. После исправления system("clear"); ошибки, тогда исправлю. Благодарю.
Скорее всего это просто буферизация. Делайте fflush(stdout); перед сном.
Я почти уверен, что вы переполнены text. Используйте больший буфер (BUFSIZ всегда должен быть вашим стандартом, если только вам не нужно что-то большее или у вас особые требования к памяти) и проверьте функции, которые я сказал вам проверить на переполнение буфера.
@Yang system("clear") не может потерпеть неудачу (если только не возникнут какие-то странные условия). Вероятно, есть переполнение буфера, вызывающее неопределенное поведение, и это может проявляться как угодно, заставляя вас думать, что clear терпит неудачу.
@melpomene Спасибо за помощь. ответом было стирание буфера после printf();
Спасибо за всех. Ответ: сделайте код вроде while(EOF!=fscanf(f,"%s",text)){ //fscanf(f,"%s", text); printf("%s ",text); fflush(stdout); usleep(80000); }
@Yang Вы должны опубликовать свой ответ как ответ. Кстати, это не «стирание» буфера, а его очистка.





#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
void printFiles(char *file1,char *file2,char *change1, char *change2){
FILE *f;
char *text = malloc(sizeof(char)*100);
f=fopen(file1,"r");
system("clear");
//while(!feof(f)){
while(EOF!=fscanf(f,"%s",text)){
//fscanf(f,"%s", text);
printf("%s ",text);
fflush(stdout);
//usleep(20000);
}
//sleep(3);
fclose(f);
printf("\n");
//all comment problems are appear here. and if I give delay, such as usleep() or sleep, delay also appear here. Not appear each wrote part.
f=fopen(file2,"r");
//while(!feof(f)){
while(EOF!=fscanf(f,"%s",text)){
if (strcmp(text,"**,")==0){
strcpy(text,change1);
strcat(text,",");
}
else if (strcmp(text,"**")==0){
strcpy(text,change1);
}
else if (strcmp(text,"##.")==0){
strcpy(text,change2);
strcat(text,".");
}
else if (strcmp(text,"##,")==0){
strcpy(text,change2);
strcat(text,",");
}
printf("%s ",text);
fflush(stdout);// The answer.
//usleep(200000);
}
fclose(f);
free(text);
sleep(3); //here is problem. This part works in the above commented part "//all comment problems are appear here."
system("clear"); //here is problem. This part works in the above commented part "//all comment problems are appear here."
}
int main(){
char file1[100] = "./file1.txt";
char file2[100] = "./file2.txt";
char change1[100] = "text1";
char change2[100] = "text2";
printFiles(file1,file2,change1,change2);
return 0;
}
Подсказка для
That's probably just buffering. Do fflush(stdout); before you sleep. – melpomene
Спасибо.
Вы можете попробовать это решение для задерживать.
#include <time.h>
#include <stdio.h>
void delay(double seconds)
{
const time_t start = time(NULL);
time_t current;
do
{
time(¤t);
} while(difftime(current, start) < seconds);
}
int main(void)
{
printf("Just waiting...\n");
delay(3);
printf("...oh man, waiting for so long...\n");
return 0;
}
Следующее решение очень похоже на предыдущее, но с решением очистить терминал.
#include <time.h>
#include <stdio.h>
#ifdef _WIN32
#define CLEAR_SCREEN system ("cls");
#else
#define CLEAR_SCREEN puts("\x1b[H\x1b[2J");
#endif
void delay(double seconds)
{
const time_t start = time(NULL);
time_t current;
do
{
time(¤t);
} while(difftime(current, start) < seconds);
}
int main(void)
{
printf("Just waiting...\n");
delay(2); //seconds
printf("...oh man, waiting for so long...\n");
delay(1);
CLEAR_SCREEN
return 0;
}
Я не могу понять фактическую проблему, которая у вас есть. Вы можете уточнить?