#c #file #fopen
#c #файл #fopen
Вопрос:
Мне нужно прочитать текстовый файл (E3-5.txt ), и найдите символ c1, который будет заменен на c2. Это мой неполный код:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char c;
char c1 = 'm';
char c2 = 'a';
int i;
FILE* fp;
fp = fopen("C:\E3-5.txt", "r ");
if (fp == NULL)
{
printf("File not found!");
return 0;
}
for(c = getc(fp); c != EOF; c = getc(fp))
{
if(c == 'm')
{
i = ftell(fp);
printf("nPosition %d", i);
}
}
}
У меня возникли проблемы с поиском позиции c1 в тексте и как ее переписать.
Редактировать:
Я использовал код из ответа, но он не изменил текст.
Это новый код:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char c;
char c1 = 'm';
char c2 = 'a';
int i;
FILE* fp;
fp = fopen("C:\E3-5.txt", "rb ");
if (fp == NULL)
{
printf("File not found!");
return 0;
}
else
{
for(c = getc(fp); c != EOF; c = fgetc(fp))
{
if(c == c1)
{
fseek(fp, -1, SEEK_CUR);
fputc(c2, fp);
}
else
{
return 0;
}
}
}
return 0;
}
Программа вернула 0, ничего не написав в тексте
Комментарии:
1. поскольку окна открываются с
rb
Ответ №1:
Здесь у вас очень наивный:
int freplace(FILE *f, char needle, char repl)
{
int result = 1;
int c;
if(f)
{
while((c = fgetc(f)) != EOF)
{
if(c == needle)
{
fseek(f, -1, SEEK_CUR);
fputc(repl, f);
//all I/O functions require error handling
}
}
}
return resu<
}
Комментарии:
1. Привет, я отредактировал вопрос.
Ответ №2:
getc()
возвращает int
значение, поэтому вам нужно объявить int c
, что не char c
проверять EOF.
ftell()
возвращает местоположение. Используйте fwrite()
или fputc()
для записи в файл в этом месте, установив с fseek()
помощью .
Перейдите к https://en.cppreference.com/w/c для справки. Многие новички не могут прочитать все стандартные библиотечные функции, а некоторые даже изобретают велосипед.
Комментарии:
1. Я не думаю, что это проблема, так как я использовал
char c
несколько раз в своем предыдущем коде, и он отлично работает.2. Это злоупотребление неопределенным поведением.
3. @MariaMarchellaGandhi итак, вы много раз совершали одну и ту же ошибку в прошлом. Узнайте о неопределенном поведении.
Ответ №3:
Вы действительно не хотите напрямую манипулировать файлом. Когда-либо. Это просто запрос на повреждение данных. Вместо этого создайте новый файл и переместите его, когда закончите. Кроме того, писать код намного проще. Вы можете сделать это с помощью чего-то вроде:
#include <stdio.h>
#include <unistd.h>
int
main(int argc, char **argv)
{
int c1 = argc > 1 ? argv[1][0] : 'm';
int c2 = argc > 2 ? argv[2][0] : 'a';
const char *path = argc > 3 ? argv[3] : "stdin";
FILE *in = argc > 3 ? fopen(path, "r") : stdin;
if( in == NULL ){
perror(path);
return 1;
}
FILE *out = stdout;
char tmp[1024] = ".tmpXXXXX";
char *outpath = "stdout";
if( argc > 3 ){
outpath = tmp;
int fd = mkstemp(tmp);
if( fd == -1 ){
perror("mkstemp");
return 1;
}
if( (out = fdopen(fd, "w")) == NULL ){
perror(tmp);
return 1;
}
}
int c;
while( (c = fgetc(in)) != EOF ){
if( c == c1 ){
c = c2;
}
if( fputc(c, out) == EOF ){
perror(outpath);
return 1;
}
}
if( argc > 3 ){
if( fclose(out) ){
perror(outpath);
return 1;
}
if( rename(outpath, path) ){
perror(path);
return 1;
}
}
return 0;
}
Ответ №4:
Замена строки
Просто для полноты картины, вот немного кода для замены слова в файле! Это заменит один символ, поэтому, конечно, он отвечает на вопрос и показывает несколько полезных примеров.
Это также моя первая и единственная нетривиальная золотая программа, написанная в мае 1994 года! Хотя вы, конечно, можете придраться к нему, он работал так, как задумано, и мои коллеги и я использовали его по-разному для задач, связанных с системным администратором. Скомпилирован на MS C / C
#include <stdio.h>
#include <string.h>
#define err(e) {_fcloseall(); fprintf(stderr,
"USAGE: chg source dest oldstr newstrn%sn",e); exit(1);}
main (int argc,char *argv[])
{
FILE *in,*out;
char buffer[200];
char *old,*new;
int i,j,k;
if (argc!=5)
err("invalid # of parameters");
if ((in=fopen(argv[1],"r"))==NULL)
err("Can't open source");
if ((out=fopen(argv[2],"w"))==NULL)
err("Can't open dest");
old=argv[3];
new=argv[4];
if (*old=='"')
old ;
if (*new=='"')
new ;
if (i=strlen(old) amp;amp; old[i-1]=='"')
old[i-1]=0;
if (i=strlen(new) amp;amp; new[i-1]=='"')
new[i-1]=0;
if (!*old)
err("Can't search for nothing!");
if (!*new)
err("Can't replace nothing!");
j=0;
while (!feof(in))
{
if ((buffer[j]=fgetc(in))==EOF)
break;
buffer[j 1]=0;
j ;
if (!old[j-1])
{
fprintf(out,new);
fputc(buffer[j-1],out);
j=0;
}
else if (_strnicmp(buffer,old,j))
{
fprintf(out,buffer);
j=0;
}
else if (j>195)
err("Internal error, buffer filled past 195");
}
}