Задача на С удаление из файла
Задание заключается в том, что в файле должны остаться слова, в которых есть хоть одна буква "а" и ни одной буквы "е". Слова под мою выборку определяются правильно, но я не знаю как удалить их из файла. Мой код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 32
int
main ()
{
FILE *fp, *fp2;
char buffer[N];
int count = 0;
char *word = NULL;
if ((fp = fopen ("text.txt", "r")) == NULL)
{
printf ("Error read file");
exit (0);
}
while (!feof (fp))
{
count = 0;
fgets (buffer, N, fp);
for (int i = 0; i < strlen (buffer); i++)
{
if (buffer[i] != '\n')
{
count++;
}
if (buffer[i] == '\n')
{
word = (char *) malloc ((count + 1) * sizeof (char));
for (int j = 0; j < count + 1; j++)
{
word[j] = buffer[(i - count) + j];
}
word[count] = '\0';
char *ptr = strchr (word, 'a');
char *ptr2 = strchr (word, 'e');
if (ptr == NULL && ptr2 != NULL)
{
puts (word);
}
else
continue;
}
}
}
fclose (fp);
return 0;
}
Ответы (1 шт):
Автор решения: nevilad
→ Ссылка
Вот так это можно сделать, суть объяснена в комментариях:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 32
void HandleWord(const char* pWordBegin, int wordSize, FILE *fp)
{
//memchr позволяет указать длину, не нужно чтобы буфер заканчивался нулями.
//Т.е. можно искать в оригинальном буфере и не надо делать копию слов.
if (memchr(pWordBegin, 'a', wordSize) &&
!memchr(pWordBegin, 'e', wordSize))
{
fwrite(pWordBegin, 1, wordSize, fp);
//В оригинале писали в строку завершающий ноль:
//word[count] = '\0';
//Этот код запишет строки так, как они были разделены в оригинальном
//файле - переводом строки или концом файла.
}
}
int main()
{
FILE *fp;
char* fileData;
long int fSize;
size_t readSize;
int wordBegin;
//Открываем файл на чтение
if ((fp = fopen("text.txt", "rb")) == NULL)
{
printf("Error open file for reading");
exit(0);
}
//Получим размер файла
fseek(fp, 0L, SEEK_END);
fSize = ftell(fp);
fseek(fp, 0L, SEEK_SET);
//Выделим буфер под содержимое файла
fileData = (char*)malloc(fSize);
if (!fileData)
{
printf("Error allocate %lu bytes", fSize);
exit(0);
}
//Считаем содержимое файла
readSize = fread(fileData, 1, fSize, fp);
if( readSize != fSize)
{
printf("Error reading %lu bytes, read only %zu bytes", fSize, readSize);
exit(0);
}
//Закрываем файл
fclose(fp);
//Открываем тот же файл на запись
if ((fp = fopen("text.txt", "wb")) == NULL)
{
printf("Error open file for writing");
exit(0);
}
//В оригинале читали строки размером не более 32 и через fgets, т.е. до следующего перевода
//каретки или конца файла. Поэтому проходим по символам строки в поиске '\n'.
wordBegin = 0;
for (int i = 0; i < fSize; i++)
{
if (fileData[i] == '\n')
{
HandleWord(&fileData[wordBegin], i - wordBegin + 1, fp);
wordBegin = i + 1;
}
}
//Обработка последнего слова, которое может не завершаться переводом строки.
if (wordBegin < fSize)
HandleWord(&fileData[wordBegin], fSize - wordBegin, fp);
//Закрываем файл
fclose(fp);
return 0;
}