Чтение, обработка и запись в бинарный файл. Найти и исправить ошибки в коде - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Есть строка, ее надо разбить на слова с буквой d. Строку ввести с экрана, потом записать в бинарный файл, потом с него считать, потом разбить, результат записать в другой бинарный файл, его считать и вывести на экран результат. Буду очень благодарен. Мой код не работает.
 #include <stdlib.h>
  #include <stdio.h>
  #include <string.h>

int main() {
        const char delim[]=",.";
        char str[250];
        FILE *write, *read, *lastwrite, *lastread;
        gets(str);
        write=fopen("1.bin","wb");
        if (write!=NULL) fputs(str,write);
        fclose(write);
read=fopen("1.bin","rb");
if (read!=NULL) fgets(str,250,read);
fclose(read);
char *word=strtok(str,delim);
lastwrite=fopen("2.bin","wb");
for (;word;word=strtok(NULL,delim)) {
        if (strchr(word,'d')&&(lastwrite!=NULL))
                fputs(word,lastwrite);
}
fclose(lastwrite);
 
lastread=fopen("2.bin","rb");
if (lastread!=NULL) fgets(word,250,lastread);
fclose(lastread);
puts(word);
return 0; }
Так может кто-нибудь помочь?
Хотя бы в чем ошибка можете подказать?
Заменил операции. Теперь отладка показывает на ошибку в последнем fread(). А в первом варианте показывала на fgets();
#include <stdlib.h>
  #include <stdio.h>
  #include <string.h>

int main() {
        const char delim[]=",.";
        char str[250];
        FILE *write, *read, *lastwrite, *lastread;
        gets(str);
        write=fopen("1.bin","wb");
        if (write!=NULL) 
        fwrite(str,sizeof(char),sizeof(250),write);
        fclose(write);
read=fopen("1.bin","rb");
if (read!=NULL) 
fread(str,sizeof(char),sizeof(250),read);
fclose(read);
char *word=strtok(str,delim);
lastwrite=fopen("2.bin","wb");
for (;word;word=strtok(NULL,delim)) {
        if (strchr(word,'d')&&(lastwrite!=NULL))
                fputs(word,lastwrite);
        fwrite(word,sizeof(char),sizeof(250),lastwrite);
}
fclose(lastwrite);
 
lastread=fopen("2.bin","rb");
if (lastread!=NULL) 
fread(word,sizeof(char),sizeof(250),lastread);
fclose(lastread);
puts(word);
return 0; }

Решение задачи: «Чтение, обработка и запись в бинарный файл. Найти и исправить ошибки в коде»

textual
Листинг программы
#define  WORK_FILE_1       "test1.bin"
#define  WORK_FILE_2       "test2.bin"
#define  MAX_STR_LEN       (256)
 
int main(int argc,char** argv)
{
   char        pszStr [MAX_PATH + 1];
               
   FILE*       pIn  = NULL;
   FILE*       pOut = NULL;
 
   gets(pszStr);
 
   pOut = fopen(WORK_FILE_1,"wb");
   
   if (!pOut)
   {
      // Error !
      return 0;
   }
 
   fputs(pszStr,pOut);
   
   fclose(pOut);
   pOut = NULL;
 
   pIn = fopen(WORK_FILE_1,"rb");
 
   if (!pIn)
   {
      // Error !
      return 0;
   }
   
   memset(pszStr,0,MAX_STR_LEN);
      
   fgets(pszStr,MAX_STR_LEN,pIn);
 
   fclose(pIn);
   pIn = NULL;
 
   pOut = fopen(WORK_FILE_2,"wb");
 
   if (!pOut)
   {
      // Error !
      return 0;
   }
 
   char*    pszWord = pszWord = strtok(pszStr," .,!");
 
   while (pszWord)
   {
      if (strchr(pszWord,'d'))
      {
         fputs(pszWord,pOut);
         fputs("\n",pOut);
      }
 
      pszWord = strtok(NULL," .,!");
   }
   
   fclose(pOut);
   pOut = NULL;
 
   pIn = fopen(WORK_FILE_2,"rb");
 
   if (!pIn)
   {
      // Error !
      return 0;
   }
   
   memset(pszStr,0,MAX_STR_LEN);
      
   while (fgets(pszStr,MAX_STR_LEN,pIn))
   {
      puts(pszStr);
   }
 
   fclose(pIn);
   pIn = NULL;
 
   return 0;
}

Объяснение кода листинга программы

  1. Ошибка: Неинициализированный указатель может быть использован в качестве адреса памяти. Это происходит в строке char* pszWord = pszWord = strtok(pszStr, .,!); и в последующих строках кода, где используется pszWord. Исправление: Указатель pszWord должен быть инициализирован как char* pszWord = NULL;.
  2. Ошибка: Переменная pszStr может быть использована без инициализации. Это происходит в строке fputs(pszStr,pOut); и в последующих строках кода, где используется pszStr. Исправление: Перед использованием pszStr должен быть инициализирован как memset(pszStr,0,MAX_STR_LEN);.
  3. Ошибка: Некорректная проверка наличия символа 'd' в строке. В строке if (strchr(pszWord,'d')) проверяется наличие символа 'd' в строке pszWord, но не обеспечивается, что pszWord содержит только символы 'd'. Исправление: Необходимо использовать функцию strcmp() для проверки, является ли pszWord строкой, содержащей только символы 'd'.
  4. Ошибка: Переменная pszStr может быть использована без инициализации. Это происходит в строке fgets(pszStr,MAX_STR_LEN,pIn) и в последующих строках кода, где используется pszStr. Исправление: Перед использованием pszStr должен быть инициализирован как memset(pszStr,0,MAX_STR_LEN);.
  5. Ошибка: Неинициализированный указатель может быть использован в качестве адреса памяти. Это происходит в строке char* pszWord = pszWord = strtok(pszStr, .,!); и в последующих строках кода, где используется pszWord. Исправление: Указатель pszWord должен быть инициализирован как char* pszWord = NULL;.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4 из 5
Похожие ответы