Чтение, обработка и запись в бинарный файл. Найти и исправить ошибки в коде - 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;.