Файлы

Firiat

Well-Known Member
19.10.2010
48
0
#1
Привет всем !
Создал два файла в папке Projects\Rabota c File\Rabota c File , мне нужно скопировать с одного файла в другой информацию до однострочного комментария. Вот что у меня получилось.

C++:
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <iomanip>
using namespace std;
void main ()
{
char ch;
FILE *fp=fopen( "test","r" );
FILE *fp1=fopen( "testa","w" );
if (fp!=NULL)
{
ch=getc(fp);
while (ch!=EOF)
{	
while (ch!='/')
fputc(ch,fp1);
ch=getc(fp);
}
fclose(fp);
fclose(fp1);
}
}
 

hosm

* so what *
18.05.2009
2 442
9
#4
если надо считать только до символа / , то попробуй переписать цикл while (ch!=EOF) примерно так
C++:
while (ch!=EOF) { 
if (ch=='/') break;
fputc(ch,fp1);
ch=getc(fp); 
}
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">если считывать надо до //</div></div><div class="sp-body"><div class="sp-content">- вместо break надо считать и проверить следующий символ в файле:
при EOF - записать / и выйти из while через break,
при / - выйти из while через break,
в остальных случаях:
1) записать /
2) учесть и записать следующий за / символ, считанный ранее
3) продолжить дальнейшее считывание файла.
 

Firiat

Well-Known Member
19.10.2010
48
0
#5
Я хочу считывать построчно . Можно так (только на strcat(fp,"\n")) ругается) ?

C++:
while (ch!=EOF) 
{ 
if (ch=='/') break;
fputc(ch,fp1);
strcat (fp,"\n");
ch=getc(fp);
 

Firiat

Well-Known Member
19.10.2010
48
0
#6
если в файле записано так к примеру:

dfgg//sda
sads//jhh
ret//oip

после записи в другой файл должно быть так :

dfgg
sads
ret
 
I

ierofant

Гость
#7
Вариант такой есть, но вообще можно подумать ещё попроще. А думать пока не хочется :lovecodeby:
C++:
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>

typedef std::vector<char> Vect;
typedef std::istreambuf_iterator<char> InItr;
typedef std::ostreambuf_iterator<char> OutItr;

static bool clear_comments (Vect &_vect);

int main ()
{
Vect vect;
std::ifstream in ("file1.txt");
if (in)
{
std::copy (InItr (in), InItr (), std::back_inserter (vect));
in.close ();
}

while (clear_comments (vect));

std::ofstream out ("file2.txt", std::ios::trunc);
if (out)
{
std::copy (vect.begin (), vect.end (), OutItr (out));
out.close ();
}

return 0;
}

bool clear_comments (Vect &_vect)
{
bool ret = false;
Vect::iterator beg, end;
beg = end = std::find (_vect.begin (), _vect.end (), '/');
if (beg != _vect.end () && *(++end) == '/')
{
end = std::find (end, _vect.end (), '\n');
_vect.erase (beg, end);
ret = true;
}
return ret;
}
 
I

ierofant

Гость
#8
Всё таки мысля сама лезет, тоже не идеал, но уже попроще:
(if/else наверно можно красивее сделать, но я утомился)
C++:
#include <fstream>
#include <iterator>

typedef std::istreambuf_iterator<char> InItr;

int main ()
{
std::ifstream in ("file1.txt");
if (in)
{
std::ofstream out ("file2.txt", std::ios::trunc);
if (out)
{
bool copy = true;
for (InItr itr = InItr (in); itr != InItr (); ++itr)
{
if (copy)
{
if (*itr == '/')
{
if (*(++itr) == '/') copy = false;
else 
{
out.put ('/');
if (itr != InItr ())out.put (*itr);
}
}
else out.put (*itr);
}
else
{
if (*itr == '\n')
{
copy = true;
out.put (*itr);
}
} 
}
out.close ();
}
in.close ();
}

return 0;
}
 

lazybiz

Well-Known Member
03.11.2010
1 339
0
#9
C++:
#include <stdio.h>

void main()
{
int		ch0, ch1;	// !!! int !!!
FILE  *fp0, *fp1;

fp0 = fopen( "text", "rb" );
if ( fp0 ) {
fp1 = fopen( "texty", "wb+" );
while ( (ch0 = fgetc( fp0 )) != EOF ) { 
if ( ch0 == '/' ) {
if ( (ch1 = fgetc( fp0 )) != EOF ) {
if ( ch1 == '/' ) {
while ( ch1 != '\n' && ch1 != EOF ) ch1 = fgetc( fp0 );
fputc( '\r', fp1 );
fputc( '\n', fp1 );
} else {
fputc( ch0, fp1 );
fputc( ch1, fp1 );
}
}
} else {
fputc( ch0, fp1 );
}
}
fclose( fp0 );
fclose( fp1 );
}
}