C не следует процедуре работы программы

резюме: система («очистить»); не работает хорошо.

Я использую 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)...`, но результат тот же.

Это ошибка компилятора? Если это так, что я должен сделать для решения этой проблемы? Спасибо.

Я не могу понять фактическую проблему, которая у вас есть. Вы можете уточнить?

Thomas Jager 08.05.2019 16:03

с использованием версии gcc: gcc (Ubuntu 7.4.0-1ubuntu1~18.04) 7.4.0 Copyright (C) Free Software Foundation, Inc., 2017 г. Это бесплатное программное обеспечение; см. источник условий копирования. НЕТ гарантии; даже не для КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННОЙ ЦЕЛИ.

Yang 08.05.2019 16:04

@yang Что этот комментарий должен прояснить?

Eugene Sh. 08.05.2019 16:05

'система ("очистить");' не действует, когда функция завершилась, действует 'fclose()';

Yang 08.05.2019 16:05

извините, я исправлю комментарий

Yang 08.05.2019 16:06

Вы должны проверить возвращаемое значение fopen

alx 08.05.2019 16:06

Вы хотите сказать, что system("clear") не работает?

Eugene Sh. 08.05.2019 16:07

Вы должны использовать strscpy (возможно, вам придется кодировать его самостоятельно), если только вы не знаете наверняка многое о строках, используемых strcpy. Если вы не хотите использовать strscpy, подумайте хотя бы об использовании strlcpy (из libbsd) или strncpy (стандартно)

alx 08.05.2019 16:09

То же самое с strcat, что и с strcpy.

alx 08.05.2019 16:10

@ЕвгенийШ. да. Похоже плохо работает

Yang 08.05.2019 16:11

В <stdio.h> есть макрос под названием FILENAME_MAX. Вы должны использовать это вместо магического числа 100

alx 08.05.2019 16:15

В malloc вы должны использовать sizeof(*text) вместо sizeof(char) для (маловероятного) случая, когда вы меняете тип данных text.

alx 08.05.2019 16:18

@CacahueteFrito да, это был прототип всего кода. После исправления system("clear"); ошибки, тогда исправлю. Благодарю.

Yang 08.05.2019 16:24

Скорее всего это просто буферизация. Делайте fflush(stdout); перед сном.

melpomene 08.05.2019 16:25

Я почти уверен, что вы переполнены text. Используйте больший буфер (BUFSIZ всегда должен быть вашим стандартом, если только вам не нужно что-то большее или у вас особые требования к памяти) и проверьте функции, которые я сказал вам проверить на переполнение буфера.

alx 08.05.2019 16:27

@Yang system("clear") не может потерпеть неудачу (если только не возникнут какие-то странные условия). Вероятно, есть переполнение буфера, вызывающее неопределенное поведение, и это может проявляться как угодно, заставляя вас думать, что clear терпит неудачу.

alx 08.05.2019 16:29

@melpomene Спасибо за помощь. ответом было стирание буфера после printf();

Yang 08.05.2019 16:30

Спасибо за всех. Ответ: сделайте код вроде while(EOF!=fscanf(f,"%s",text)){ //fscanf(f,"%s", text); printf("%s ",text); fflush(stdout); usleep(80000); }

Yang 08.05.2019 16:31

@Yang Вы должны опубликовать свой ответ как ответ. Кстати, это не «стирание» буфера, а его очистка.

alx 08.05.2019 16:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
19
49
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
#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(&current);
    } 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(&current);
    } 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;
}

Другие вопросы по теме