mrKirill 1 3 февраля, 2011 Опубликовано 3 февраля, 2011 · Жалоба Имеется ситуация, что нужно в файле писать каждый параметр с новой строки... Проделываю следующую последовательность операций: 1. f_open(...) - открыл файл 2. f_lseek(...) - перешел в конец файла 3. f_write(...) - записал новую строку На деле f_lseek получает правильное значение указателя конца файла, но запись строки происходит с нулевого байта файла и тем самым просто затираются старые данные и записываются новые...Что я не учел? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 3 февраля, 2011 Опубликовано 3 февраля, 2011 · Жалоба На деле f_lseek получает правильное значение указателя конца файла, но запись строки происходит с нулевого байта файла и тем самым просто затираются старые данные и записываются новые...Что я не учел? Код приведите. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 3 февраля, 2011 Опубликовано 3 февраля, 2011 · Жалоба Вот собственно FIL dataFile; f_open(&dataFile,"1.txt",FA_OPEN_ALWAYS|FA_WRITE); f_lseek(&dataFile, dataFile.fsize); f_write(&dataFile,&str,strlen(str),&writen); Значение fsize вывожу в терминал, оно совпадает с тем что есть внутри файла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 3 февраля, 2011 Опубликовано 3 февраля, 2011 · Жалоба Последовательность правильная, видимо дело в чём-то другом. Вот для примера мой рабочий код: bool logfile_t::do_flush() { FRESULT res; // open file for writing if ((res = f_open(&fi_, filename_, FA_WRITE | FA_OPEN_ALWAYS))) { f_close(&fi_); uart << "\r\n logfile_t::flush: error opening log file " << filename_ << ", code = " << res; return false; } // Move to end of the file to append data if ((res = f_lseek(&fi_, fi_.fsize))) { f_close(&fi_); uart << "\r\nlogfile_t::flush: log file error while f_lseek, code = "<< res; return false; } UINT written; res = f_write(&fi_, buf_, count, &written); f_close(&fi_); if (res) { uart << "\r\nlogfile_t::flush: f_write error = " << res; return false; } if (written < count) { uart << "\r\nlogfile_t::flush: written (" << written << ") < count"; return false; } return true; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 3 февраля, 2011 Опубликовано 3 февраля, 2011 · Жалоба Проверьте возвращаемое значение функции lseek(). Оно должно быть равно нулю. Также, в случае успешного завершения lseek() значение dataFile.fptr должно быть равно требуемому dataFile.fsize. ЗЫ: не используется ли, случайно, фича _USE_FASTSEEK? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 3 февраля, 2011 Опубликовано 3 февраля, 2011 · Жалоба lseek() возвращает стабильно 0. dataFile.fptr = dataFile.fsize Это я сразу стал смотреть как столкнулся с проблемой. ЗЫ: не используется ли, случайно, фича _USE_FASTSEEK? Нет, выключена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 3 февраля, 2011 Опубликовано 3 февраля, 2011 · Жалоба Возможно, глюк в драйвере диска. Продебажте по шагам позиционирование\запись. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 16 февраля, 2011 Опубликовано 16 февраля, 2011 · Жалоба Была некоторая пауза...Снова взялся за копание кода. Последовательность f_open(...); f_lseek(...); f_write(...); f_close(...); Заменил на f_open(...); f_lseek(...); f_write(...); f_sync(...); Результат стал получаться, т.е. информация в файл дописывается, но возникла другая проблема: записываемый текст совершенно не то что должно быть. Сконфигурирована кодировка Win1251, а в файле полная абракадабра, которая не подходит ни под одну кодировку. Записываю одно и тоже слово, а абракадабра постоянно разная... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 5 16 февраля, 2011 Опубликовано 16 февраля, 2011 · Жалоба писать каждый параметр с новой строки... Есть же функция записать строку. Почему её не используйте? В таблице конверсии Win1251 ошибка толи с буквой 'Я' толи с 'Ы' Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 16 февраля, 2011 Опубликовано 16 февраля, 2011 · Жалоба Честно говоря даже и не подумал насчет этой функции, записи строки, попробую. А насчет конверсии - я пишу латинскими буквами. Что-то странное в этом есть... Пишу следующую строку: f_puts("proverka na zapis'\r\n",&dataFile); Повторяю строку N количество раз и в файле же вижу: test sU„ e3T У–°ЧџhЯfDы‰ґuLU‰С‹qҐњшЬ–ѕ&кz°ihв7ґ<MЁк¤»к«чуыхё/|ЊY<МЈќlЋГі7з›mч”zbм-ъiІiАзХЃ-mП“ЎпПюяњэи2Кщ§‚йМ9ЗcіьиT›цй«'ылTЬSБньф»п!G/wo‹“ Юoo+хьuЖР Чем большее количество раз повторяю N, тем больше белиберды в файле... Отдельно скажу насчет первого слова "test" это слово я записывал еще в начале опытов с файловой системой, после этого несколько раз форматировал карточку. И теперь при каждом создании файла и записи оно сам по себе проявляется, а нужные слова не пишутся, цифры к слову тоже не пишутся... Все функции работают нормально, возвращают стабильно 0. Толи я в лыжи обут... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 18 февраля, 2011 Опубликовано 18 февраля, 2011 · Жалоба Идет следующая последовательность строк: 1. f_open(&dataFile,"log.txt",FA_OPEN_ALWAYS|FA_WRITE); - Открыл файл, если его нет, то создаю. 2. f_lseek(&dataFile,dataFile.fsize); - Задал указателю точку конца файла. Но вот в чем проблема к строчке №2 значение dataFile.fsize держится в 0 и потому каждая последующая строка всегда начинает записываться с позиции 0, вместо дописывания к концовке файла. Между строками 1 и 2 нужно что-то дополнительно делать или может пауза нужна какая-то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 15 18 февраля, 2011 Опубликовано 18 февраля, 2011 · Жалоба Между строками 1 и 2 нужно что-то дополнительно делать или может пауза нужна какая-то? Я же вам в посте №4 привёл рабочую последовательность. Нужно проверять в первую очередь не dataFile.fsize, а результаты вызова функций. Если же и там всё в порядке, то проблема скорее всего не в FatFS, а в её кривом портировании. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 18 февраля, 2011 Опубликовано 18 февраля, 2011 · Жалоба Учитывая, что FatFS очень распространена и повсеместно работоспособна, скорее всего дело в реализации функций чтения/записи, реализация которых лежит всецело на разработчике. Думается, что проблема именно в функции записи. Потому как, если бы чтение не работало, сразу же повалились бы ошибки при diskinitialize(n) и диск не монтировался бы в принципе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mrKirill 1 18 февраля, 2011 Опубликовано 18 февраля, 2011 · Жалоба Я же вам в посте №4 привёл рабочую последовательность. Нужно проверять в первую очередь не dataFile.fsize, а результаты вызова функций. Если же и там всё в порядке, то проблема скорее всего не в FatFS, а в её кривом портировании. Результаты вызовов функций - 0, т.е. все в порядке... Ваша последовательность ничем в общем-то особо и не отличается от примеров от Chan'а... Что касательно dataFile.fsize, когда я в строке f_lseek(&dataFile,dataFile.fsize); вручную задаю точку указателя, то у меня все записывается как надо, с указанного места, но мне надо чтобы функция сама устанавливалась в конец файла и дописывала его. После открытия файла вывожу в терминал значение dataFile.fsize и оно нулевое...в итоге указатель постоянно устанавливается в нулевую позицию и строки вместо того чтобы дописываться в файл - затирают друг друга. Изобретать костыль не есть гуд, надо понять почему происходит затык. Думается, что проблема именно в функции записи. Потому как, если бы чтение не работало, сразу же повалились бы ошибки при diskinitialize(n) и диск не монтировался бы в принципе. Функция записи работает. Инициализация работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sonycman 0 18 февраля, 2011 Опубликовано 18 февраля, 2011 · Жалоба После открытия файла вывожу в терминал значение dataFile.fsize и оно нулевое... Замените атрибут FA_OPEN_ALWAYS на FA_OPEN_EXISTING. Сделайте объект dataFile статическим - static FIL dataFile; Проверьте результат, fsize всё так же после открытия файла будет равен нулю? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться