Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Deimon
35 / 35 / 2
Регистрация: 29.08.2009
Сообщений: 178
#1

fpos_t и передача в функцию FILE* (i/o stream) - C++

17.06.2011, 01:45. Просмотров 1291. Ответов 11
Метки нет (Все метки)

Есть уже созданый файл text.txt со след. содержанием:
C++
1
2
3
4
5
6
7
"1
 2
 3
 4
 5
 6
..."
Вопрос. Если в одной функции файл открывается...
C++
1
2
3
FILE* p_File;
p_File = fopen("text.txt", "r+");
writestring(p_File, &buffer[0], sizeof(buffer), 5);//char buffer[] = "Запись";
А потом этот указатель несколько раз передается в другие функции
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int setstring (FILE* pFile, int strvalue)
{
  int i;
  char A[2];
  fseek(pFile, 0, SEEK_SET);
  for (i=1; i<strvalue; i++)
  {
    fgets(&A[0], 2, pFile);
    if (feof(pFile)) return i;
  }
  return i;
}
 
 
int writestring (FILE* pFile, char* buffer, int w_value, int s_value)
{
  int ERROR=0, i;
  if ( setstring(pFile, s_value) != (s_value-1)) ERROR=1;
  char * buff = new char[w_value];
  for (i=0; i<=w_value; i++) buff[i]=buffer[i];
  fputs(buff, pFile);
  delete[] buff;
  return ERROR;
}
будет ли writestring записывать именно в то место, где остановила каретку функция setstring ?
В итоге у меня все записывается в конец файла.
C++
1
2
3
4
5
6
7
"1
 2
 3
 4
 5
 6
...Запись"
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2011, 01:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос fpos_t и передача в функцию FILE* (i/o stream) (C++):

Передача FILE и char[x] в функцию - C++
Собственно есть такой кусок кода: int Parser(int n, int value) { FILE *fp = fopen(&quot;../../DB.txt&quot;, &quot;r&quot;); char buffer; ...

Cannot open include file: 'stream.h': No such file or directory - C++
Для использования функций ввода/вывода cin/cout как я понимаю необходимо подключени библиотеки stream.h ? Но Visual Studio 2008 ругается...

Ошибка при преобразовании int в fpos_t - C++
Всем привет, ругается на строчке приравнивания int Start_Pos_UnSorted_File; fpos_t position; position = Start_Pos_UnSorted_File; ...

Передача массива в функцию используя указатель на функцию - C++
У меня имеется готовая программа без передачи функции в функцию указателем, мне нужно передать функцию ввода масива в функцию его обработки...

Передача объекта в функцию или функцию друга - C++
Здравствуйте, уважаемые программисты :) К примеру есть такой код. #include &lt;iostream&gt; using namespace std; class My_Class1 { ...

Передача указателя на шаблонную функцию в другую функцию - C++
Пишу тест для нескольких улучшений квиксорта с измерением времени. Функция benchmark принимает итераторы для диапазона элементов, указатель...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
17.06.2011, 02:53 #2
Вообще, про открытие в режиме обновления пишут, что операции чтения и записи не должны чередоваться без вызова (в общем случае) функции позиционирования. Можно попробовать перед циклом записи вставить
C
1
fseek(pFile, 0, SEEK_CUR);
Но я не знаю, поможет это или нет. У меня и без этого работает (на простом примере, думаю вызовы функций с передачей указателя ни при чём).
0
Deimon
35 / 35 / 2
Регистрация: 29.08.2009
Сообщений: 178
17.06.2011, 11:15  [ТС] #3
У меня задача заключается, в том, чтобы произвольно записать текст в файл под определенной строкой. и fseek(pFile, 0, SEEK_SET); обнуляет каретку, чтобы потом отсчитать строки от начала файла и произвести запись. Функция что отсчитывает строки вызывается из функции которая записывает строку, перед тем как записать. облазил все описания stdio.h и не нашел ни функции, которая устанавливалабы каретку в начало нужной строки, ни функции записи в определенную строку, вот и мучаюсь =(
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
17.06.2011, 13:46 #4
Да я понял задачу. Правда с текстовыми файлами обычно так не работают, ведь строки могут иметь разный размер (заменяемая и новая), а в этом случае весь хвост придётся перезаписывать всё-равно.
Но мне просто интересно, моё предложение не помогает?
0
Deimon
35 / 35 / 2
Регистрация: 29.08.2009
Сообщений: 178
17.06.2011, 21:02  [ТС] #5
Цитата Сообщение от grizlik78 Посмотреть сообщение
Но мне просто интересно, моё предложение не помогает?
Еще раз, где надо прописать предложеный вами вариант ? заместо SEEK_SET или после вызова функции setstring?


А если нужно работа со строками, чтением и записью, то что лучше использовать ?
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
17.06.2011, 21:03 #6
SEEK_CUR после вызова setstring
0
Deimon
35 / 35 / 2
Регистрация: 29.08.2009
Сообщений: 178
17.06.2011, 21:06  [ТС] #7
Такая же картина:

пишет в конце файла.

С чем лучше работать, если нужен контроль над строками ?
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
17.06.2011, 21:07 #8
Да, новый. Я исправился, но поздно
0
Deimon
35 / 35 / 2
Регистрация: 29.08.2009
Сообщений: 178
17.06.2011, 23:11  [ТС] #9
Цитата Сообщение от grizlik78 Посмотреть сообщение
Да, новый. Я исправился, но поздно
Я тоже поправил, но видимо поздно

Касательно моего вопроса, я повнимательнее почитал и наткнулся на следующее:
"You can reposition (fseek, rewind) the internal pointer to anywhere in the file for reading, but writing operations will move it back to the end of file. The file is created if it does not exist."

Вроде мелочи, а проблемы создали

Так как тогда мне работать с хранием строковых данных?
0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
17.06.2011, 23:15 #10
А где про это пишут? Я в стандарт пока не заглядывал, ориентировался на POSIX-man по fopen. В линукс работает, проблемы, видимо, в Windows?
Самый надёжный метод это создать новый файл, записать туда новую информацию, а потом заменить им старый файл. Режим обновления больше подходит для бинарных файлов, где структура обычно фиксирована.
0
Deimon
35 / 35 / 2
Регистрация: 29.08.2009
Сообщений: 178
18.06.2011, 00:47  [ТС] #11
тут пишется про a+

Впринципе перезапись даже чем то надежнее. Спасибо за оказаную помощь =)

Не по теме:

Вот начитаешься старых книг где превозносили каждый бит оперативной памяти, боясь взять лишнее, и сам начинаешь с гигами оперативки экономить жалкие 10-20 Килобайт)))))

0
grizlik78
Эксперт С++
1913 / 1445 / 113
Регистрация: 29.05.2011
Сообщений: 3,001
18.06.2011, 01:29 #12
a+ это другое. Там действительно запись возможна лишь в конец. Но у нас-то r+, обновление. Должно бы работать.

Добавлено через 25 минут
Причём я таки попробовал код из исходного поста. Запись начинается с третьей строки, то есть со смещения 4 (нумеруя смещения с нуля). Но это у меня в линуксе с g++. Больше нигде не пробовал.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2011, 01:29
Привет! Вот еще темы с ответами:

Передача двухмерного массива из функцию в функцию - C++
Допустим у меня есть функция, в которой &quot;генерируется&quot; массив. Но нужно его передать в другую функцию, которая его выведет на экран. ...

Передача в функцию - C++
вот есть такие строки кода: typedef vector&lt; vector&lt;char&gt; &gt; string_sound; void sound_func(string_sound &amp;text_sound, int sum_words)...

Передача в функцию - C++
компилятор ругается на int sumcolumn (int **a, int n) sumcolumn(a,m) почему не могу передать массив i*1, таким образом? ...

Передача указателя в функцию - C++
Здраствуйте. Если не охота читать гору текста то этот абзац + последущий за ним код можете пропустить. Задали на лабе сделать некий...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.06.2011, 01:29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru