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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
17.06.2011, 01:45     fpos_t и передача в функцию FILE* (i/o stream) #1
Есть уже созданый файл 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
...Запись"
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2011, 01:45     fpos_t и передача в функцию FILE* (i/o stream)
Посмотрите здесь:

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


А если нужно работа со строками, чтением и записью, то что лучше использовать ?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
17.06.2011, 21:03     fpos_t и передача в функцию FILE* (i/o stream) #6
SEEK_CUR после вызова setstring
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
17.06.2011, 21:06  [ТС]     fpos_t и передача в функцию FILE* (i/o stream) #7
Такая же картина:

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

С чем лучше работать, если нужен контроль над строками ?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
17.06.2011, 21:07     fpos_t и передача в функцию FILE* (i/o stream) #8
Да, новый. Я исправился, но поздно
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
17.06.2011, 23:11  [ТС]     fpos_t и передача в функцию FILE* (i/o stream) #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."

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

Так как тогда мне работать с хранием строковых данных?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
17.06.2011, 23:15     fpos_t и передача в функцию FILE* (i/o stream) #10
А где про это пишут? Я в стандарт пока не заглядывал, ориентировался на POSIX-man по fopen. В линукс работает, проблемы, видимо, в Windows?
Самый надёжный метод это создать новый файл, записать туда новую информацию, а потом заменить им старый файл. Режим обновления больше подходит для бинарных файлов, где структура обычно фиксирована.
Deimon
 Аватар для Deimon
34 / 34 / 2
Регистрация: 29.08.2009
Сообщений: 178
18.06.2011, 00:47  [ТС]     fpos_t и передача в функцию FILE* (i/o stream) #11
тут пишется про a+

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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.06.2011, 01:29     fpos_t и передача в функцию FILE* (i/o stream)
Еще ссылки по теме:

Передача в функцию C++
C++ Передача объекта в функцию или функцию друга
C++ Передача вектора в функцию

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
18.06.2011, 01:29     fpos_t и передача в функцию FILE* (i/o stream) #12
a+ это другое. Там действительно запись возможна лишь в конец. Но у нас-то r+, обновление. Должно бы работать.

Добавлено через 25 минут
Причём я таки попробовал код из исходного поста. Запись начинается с третьей строки, то есть со смещения 4 (нумеруя смещения с нуля). Но это у меня в линуксе с g++. Больше нигде не пробовал.
Yandex
Объявления
18.06.2011, 01:29     fpos_t и передача в функцию FILE* (i/o stream)
Ответ Создать тему
Опции темы

Текущее время: 22:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru