Чтение, обработка и запись в бинарный файл. Найти и исправить ошибки в коде - 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; }
Объяснение кода листинга программы
- Ошибка: Неинициализированный указатель может быть использован в качестве адреса памяти. Это происходит в строке
char* pszWord = pszWord = strtok(pszStr,
.,!);
и в последующих строках кода, где используетсяpszWord
. Исправление: УказательpszWord
должен быть инициализирован какchar* pszWord = NULL;
. - Ошибка: Переменная
pszStr
может быть использована без инициализации. Это происходит в строкеfputs(pszStr,pOut);
и в последующих строках кода, где используетсяpszStr
. Исправление: Перед использованиемpszStr
должен быть инициализирован какmemset(pszStr,0,MAX_STR_LEN);
. - Ошибка: Некорректная проверка наличия символа 'd' в строке. В строке
if (strchr(pszWord,'d'))
проверяется наличие символа 'd' в строкеpszWord
, но не обеспечивается, чтоpszWord
содержит только символы 'd'. Исправление: Необходимо использовать функциюstrcmp()
для проверки, является лиpszWord
строкой, содержащей только символы 'd'. - Ошибка: Переменная
pszStr
может быть использована без инициализации. Это происходит в строкеfgets(pszStr,MAX_STR_LEN,pIn)
и в последующих строках кода, где используетсяpszStr
. Исправление: Перед использованиемpszStr
должен быть инициализирован какmemset(pszStr,0,MAX_STR_LEN);
. - Ошибка: Неинициализированный указатель может быть использован в качестве адреса памяти. Это происходит в строке
char* pszWord = pszWord = strtok(pszStr,
.,!);
и в последующих строках кода, где используетсяpszWord
. Исправление: УказательpszWord
должен быть инициализирован какchar* pszWord = NULL;
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д