Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Замена '\n' на ',' в файле


Автор: FiMa1 28.11.2006, 13:26
Привет всем! Кто с ходу может определить что не правильно делаю:

Код

/* замена всех '\n' в файле на ',' */
#include <iostream>
using namespace std;

int main(void) {
   FILE *fp;
   char c;

   if((fp=fopen("file.txt", "r+")) == NULL) {
      printf( "The file was not opened\n" );
   }
   else {
      while ((c = fgetc(fp)) != EOF) {
         if (c == '\n') { putc(',', fp); }
         }
   }
   return 0;
}


Добавлено @ 13:30 
oops... позабыл.. fclose(fp); но не в этом сабж..

Автор: maxim1000 28.11.2006, 13:31
Код

else putc(c,fp);

Автор: FiMa1 28.11.2006, 13:42
function fgetc then increments the associated file pointer (if defined) to point to the next character. © MSDN... мля, куда же я пишу ','  smile 

Автор: maxim1000 28.11.2006, 13:47
ааа... не заметил, что пишется в тот же файл...
на мой посто можно внимания не обращать

Автор: Anikmar 28.11.2006, 13:53
Цитата(maxim1000 @ 28.11.2006,  13:47)
на мой посто можно внимания не обращать

Нужно нужно.
Эта строка там нужна обязательно - иначе результирующий файл будет из одних запятых.

Автор: FiMa1 28.11.2006, 13:54
Приколъ - в файле текст вида "12345", если так то fgetc должна "increments the associated file pointer to the next character", а putc перезаписать цифру 3 в файле на запятую - ни фига подобного..  smile 

Код

int main(void) {
   FILE *fp;
   char c;

   if((fp=fopen("file.txt", "r+")) == NULL) {
      printf( "The file was not opened\n" );
   }
   else {
      while ((c = fgetc(fp)) != EOF) {
         if (c == '2') { putc(',', fp); }
         }
   }
   return 0;
}

Автор: Anikmar 28.11.2006, 13:59
Цитата(FiMa1 @ 28.11.2006,  13:54)
цифру 3 

Начнем с того, что там нет цифры 3 в коде. Там есть цифра 2  smile 
А во-вторых - см. пост выше остальные символы интересуют или нет?
В в-третьих в тот же файл пишется уже на след. позицию... Наверное всетаки надо писать в другой файл?

Автор: maxim1000 28.11.2006, 14:03
Цитата(Anikmar @  28.11.2006,  12:53 Найти цитируемый пост)
Нужно нужно.
Эта строка там нужна обязательно - иначе результирующий файл будет из одних запятых.

если писать в другой файл - да
но можно, действительно, писать в тот же файл только те символы, которые нужно изменить (т.к. ничего сдвигать не нужно)
надо только пододвинуть файловый указатель

Автор: Любитель 28.11.2006, 18:14
fseek не забывай  smile 

Автор: Baib 28.11.2006, 23:11
А обязательно в этот же файл писать? Если нет, то всё проще:

Код


#include <fstream.h>
#include <stdio.h>


FILE *streamI;
FILE *streamO;

void main(int argc, char* argv[])
{   

streamI = fopen("Test.txt", "r");
streamO = fopen("Test.out", "w");
 
char c;
 
fseek( streamI, 0L, SEEK_SET );

while ( !feof(streamI) ) 

        {
            fscanf( streamI, "%c", &c );
            if ( c == '\n')
                {
                    c=',';
                }

            fprintf(streamO, "%c", c );
    
        }
    
        fclose(streamI);
        fclose(streamO);
        
}



Автор: Kuvaldis 29.11.2006, 02:45
Если писать в тот же файл, то можно сделать так.
Код

//------------------------------------------
#include <stdio.h>
//------------------------------------------
int main(void)
{    
   FILE *fp;    
   char sym;

   if (!(fp = fopen("file.txt", "r+")))
   {
      printf( "The file was not opened\n" );
      return 0;
   }
   while ((sym = fgetc(fp)) != EOF)
   {
        if (sym == '\n')
        {
           /* Так как нужно заменить '\n', который физически представляет собой ДВА СИМВОЛА
 с кодами  13 и 10, то заменять будем на фактически строку ", " (запятая с пробелом) */
           fseek(fp, -2, SEEK_CUR);  
           fputc(',', fp);
           fputc(' ', fp);
           fseek(fp, 0, SEEK_CUR);   // обязательно сделать
        }  
   }
   fclose(fp);
   return 0;
}
//------------------------------------------


Baib, 
при чтении символов лучше не использовать функции типа fprintf() и fscanf() - это равносильно стрельбе из пушки по воробьям. Т.е. они объемные по коду функции, достаточно медленно работающие. Оптимизированные для чтения именно одного символа (и его записи) фунции типа fgetc() работают быстрее (и реализованы, как привило, как макросы) 

Автор: Baib 29.11.2006, 04:22
Да.. действительно.. smile

Автор: FiMa1 29.11.2006, 14:48
Сорри, что я немного подисчез...

> А обязательно в этот же файл писать?
Re: да, обязательно...

В общем вариант Kuvaldis'а очень даже подходит. Спасибо за науку.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)