ibilalkayy Ответов: 4

Как написать слова в файле в одну строку?


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
  FILE * fp1 = fopen("file.csv", "r");
  FILE * fp2 = fopen("new.csv", "w");
  char string[200], toFind[200], updatedWord1[200];
  char * line =  NULL;
  char * result = NULL;
  char * word1 = NULL;
  char * word2 = NULL;

  printf("Enter word present in file: ");
  scanf("%s", toFind);

  while(fgets(string, 200, fp1)){
    // line = strtok(string, "\n");
    result = strstr(string, toFind);
    word1 = strtok(string, ",");
    word2 = strtok(NULL, ",");
    if(result)
    {
      printf("Enter another word update: ");
      getchar();
      fgets(updatedWord1, 200, stdin);
      fprintf(fp2, "%s,%s", updatedWord1, word2);
      
    }
  }
  return 0;
}


Что я уже пробовал:

У этого кода есть одна проблема. Я не знаю, как с этим справиться. Всякий раз, когда я пишу обновленное слово, результат, напечатанный в файле, разбивает обновленное Слово и старое слово с новой строкой. Нравится

Заданный Выход
обновления для Word
,слово1

Желаемый результат
обновленное слово, слово1

Какие изменения следует внести, чтобы слова были написаны в одну строку?

4 Ответов

Рейтинг:
2

CPallini

Как уже предполагали другие, виновником является fgets функция, которая не удаляет новую строку в конце пользовательского ввода, см. ссылка на fgets - C++ [^]:

Символ новой строки заставляет fgets прекратить чтение, но он считается допустимым символом функцией и включается в строку, скопированную в str.


Richard MacCutchan

Мой настоящий 5.

CPallini

:-)
Большое тебе спасибо, Ричард.

Рейтинг:
2

KarstenK

Правильный ответ: используйте отладчик, у них есть некоторые функции просмотра памяти в которой вы точно видите, что такое ваши ошибки.

Вы должны научиться делать это сами.


Рейтинг:
0

OriginalGriff

Мы не знаем: мы не можем запустить ваш код точно в тех же условиях, что и вы - хотя бы потому, что мы понятия не имеем, что вы печатаете, чтобы заставить его работать (или не работать)!

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.
Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Рейтинг:
0

CHill60

Глядя на вашу выходную линию

fprintf(fp2, "%s,%s", updatedWord1, word2);
Я бы рискнул предположить, что word2завершается символом новой строки, который необходимо удалить перед выводом


Richard MacCutchan

Я думаю, вы имеете в виду updatedWord1, который получается с помощью fgets.

CPallini

Мой виртуальный 5.

CHill60

Д'о - Конечно.

Richard MacCutchan

"Д'о". Самое употребляемое слово в моем лексиконе. :(

CHill60

Я нахожу, что чем старше я становлюсь, тем больше я должен использовать его. Я действительно иногда очень злюсь на себя, особенно на более очевидные беспорядки (как этот!). Но я нахожу, что большой бокал красного вина заставляет проблему, кажется, уйти :-)

Richard MacCutchan

Так и есть.