Используя fseek для отслеживания в обратном порядке

Попробуйте отправить все данные в одном объекте await api.post('/fileUpload/group', { currentGroupId, formData, config });. Затем получите данные в uploadFile(req, res) { const postData = req.body;; Это должно решить проблему.

5
задан Ophir Carmi 29 January 2019 в 06:52
поделиться

5 ответов

Вы видите разницу между «текстовым» и «двоичным» файлом. Когда файл открывается в текстовом режиме (без 'b' во втором аргументе fopen), библиотека stdio может (на самом деле, должна) интерпретировать содержимое файла в соответствии с соглашениями операционной системы для текстовых файлов. Например, в Windows строка заканчивается на \ r \ n, и это переводится в одиночку \ n с помощью stdio, поскольку это соглашение на языке Си. При записи в текстовый файл один \ n выводится как \ r \ n.

Это облегчает написание переносимых программ на Си, которые обрабатывают текстовые файлы. Однако некоторые детали усложняются, и одним из них является fseeking. Из-за этого стандарт C определяет fseek в текстовых файлах только в нескольких случаях: с самого начала, до самого конца, до текущей позиции, и на предыдущую позицию, которая была найдена с помощью ftell. Другими словами, вы не можете вычислить местоположение для поиска текстовых файлов. Или вы можете, но вы должны позаботиться обо всех деталях платформы самостоятельно.

В качестве альтернативы, вы можете использовать двоичные файлы и выполнять преобразования конца строки самостоятельно. Опять же, переносимость страдает.

В вашем случае, если вы просто хотите вернуться туда, где вы в последний раз выполняли fscancf, проще всего было бы использовать ftell непосредственно перед fscanf.

8
ответ дан 13 December 2019 в 05:42
поделиться

Это потому, что fseek работает с байтами, тогда как fscanf разумно обрабатывает, что возврат каретки и перевод строки - два байта, и глотает их как один символ.

2
ответ дан 13 December 2019 в 05:42
поделиться

Fseek не понимает содержимого файла и просто перемещает указатель файла на 10 символов назад.

fscanf, в зависимости от ОС, может интерпретировать переводы строки по-разному; может даже случиться так, что fscanf вставит ^ M, если вы находитесь в DOS, а ^ M не появляется в файле. Проверьте ваше руководство, поставляемое с вашим компилятором C

1
ответ дан 13 December 2019 в 05:42
поделиться

Просто попробовал это с VS2008 и обнаружил, что fscanf и fseek обрабатывают символы CR и LF одинаково (как один символ).

То же самое с двумя файлами:

0000000: 3132 3334 3554 3738 3930 3132 3334 3536 12345X7890123456

и

0000000: 3132 3334 350d 0a37 3839 3031 3233 3435 12345..789012345

Если я прочел 15 Символы, которые я получаю во втором «5», затем ищем 10 символов, следующим прочитанным символом является «X» в первом случае и CRLF во втором.

Это похоже на проблему, специфичную для ОС / компилятора.

1
ответ дан 13 December 2019 в 05:42
поделиться

Did you test the return value of fscanf? Post some code.

Take a look at ungetc. You may have to run a loop over it.

0
ответ дан 13 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: