Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замена '\n' на ',' в файле, Не правильно пишу в файл 
:(
    Опции темы
FiMa1
Дата 28.11.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Привет всем! Кто с ходу может определить что не правильно делаю:

Код

/* замена всех '\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); но не в этом сабж..

PM   Вверх
maxim1000
Дата 28.11.2006, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



Код

else putc(c,fp);



--------------------
qqq
PM WWW   Вверх
FiMa1
Дата 28.11.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



function fgetc then increments the associated file pointer (if defined) to point to the next character. © MSDN... мля, куда же я пишу ','  smile 
PM   Вверх
maxim1000
Дата 28.11.2006, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



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


--------------------
qqq
PM WWW   Вверх
Anikmar
Дата 28.11.2006, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



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

Нужно нужно.
Эта строка там нужна обязательно - иначе результирующий файл будет из одних запятых.
PM MAIL ICQ   Вверх
FiMa1
Дата 28.11.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Приколъ - в файле текст вида "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;
}

PM   Вверх
Anikmar
Дата 28.11.2006, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 9
Всего: 59



Цитата(FiMa1 @ 28.11.2006,  13:54)
цифру 3 

Начнем с того, что там нет цифры 3 в коде. Там есть цифра 2  smile 
А во-вторых - см. пост выше остальные символы интересуют или нет?
В в-третьих в тот же файл пишется уже на след. позицию... Наверное всетаки надо писать в другой файл?
PM MAIL ICQ   Вверх
maxim1000
Дата 28.11.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 17
Всего: 110



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

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

Это сообщение отредактировал(а) maxim1000 - 28.11.2006, 14:10


--------------------
qqq
PM WWW   Вверх
Любитель
Дата 28.11.2006, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



fseek не забывай  smile 


--------------------
PM MAIL ICQ Skype   Вверх
Baib
Дата 28.11.2006, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 15.9.2004

Репутация: нет
Всего: нет



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

Код


#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);
        
}



PM WWW   Вверх
Kuvaldis
Дата 29.11.2006, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Если писать в тот же файл, то можно сделать так.
Код

//------------------------------------------
#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() работают быстрее (и реализованы, как привило, как макросы) 

Это сообщение отредактировал(а) Kuvaldis - 29.11.2006, 21:50


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Baib
Дата 29.11.2006, 04:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 15.9.2004

Репутация: нет
Всего: нет



Да.. действительно.. smile
PM WWW   Вверх
FiMa1
Дата 29.11.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 408
Регистрация: 23.9.2006

Репутация: 5
Всего: 6



Сорри, что я немного подисчез...

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

В общем вариант Kuvaldis'а очень даже подходит. Спасибо за науку.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0566 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.