Nano Hash - криптовалюты, майнинг, программирование

fprintf печатает новую строку в начале файла

Я использую функцию fprintf для печати в новый файл

Я использую следующую команду для записи несколько раз:

fprintf(fp, "%-25s %d %.2f %d",temp->data.name, temp->data.day, temp->data.temp, temp->data.speed);

Проблема в том, что иногда в файле появляется лишняя новая строка в качестве первого символа. Может быть, это остатки от какого-то буфера, я действительно не знаю...

typedef struct Data {
    char name[26];
    int day;
    int speed;
    float temp;
} Data ;

@spatz вы были правы, я новичок в форматировании строк, и мне сказали сделать один для fscanf, где я должен был ожидать неопределенное количество пробелов между битами данных, вот что я придумал , я почти уверен, что это источник проблемы:

check=fscanf(fp1, "%20c%*[^0-9]%d%*[^0-9]%f%*[^0-9]%d%*[^\n]%*c", name, &day, &temp, &speed);

только первая строка читается нормально, а все последующие строки читаются с новой строки предыдущей строки.

Может кто-нибудь показать мне правильный способ написать эту вещь?

22.01.2012

  • Покажите определение типа temp->data. Вы компилируете со всеми предупреждениями? 22.01.2012
  • Как открывается fp? Может быть, просто name начинается с новой строки? 22.01.2012
  • Пожалуйста, опубликуйте полный код, иначе все попытки решить вашу проблему будут чистой спекуляцией. т.е. как вы открываете файл, существует ли файл раньше, открыт ли он в другой программе, каковы фактические данные в вашей структуре data? 22.01.2012

Ответы:


1

Вместо того, чтобы снова и снова вызывать fscanf() и надеяться, что символы новой строки совпадают, используйте fgets() для получения одной строки за раз, анализируйте ее с помощью fscanf() и выполняйте обработку ошибок построчно. . Это будет менее подвержено ошибкам, и похоже, что это устранит вашу проблему без дополнительных усилий.

22.01.2012

2

Ваша проблема в том, что name начинается с новой строки, и эта новая строка заканчивается в файле.

Чтобы правильно проанализировать файл, мне нужно знать его формат, но сейчас я предполагаю, что это <string> <int> <int> <float>, где количество пробелов между каждым элементом может варьироваться.

Строка формата, с которой я бы начал, это просто "%s%d%d%f", и пусть fscanf() обрабатывает пробелы. С помощью этой строки формата я смог правильно разобрать строки, например

foo     3   4 7  

Если это вас не устраивает, вы можете уточнить формат файла, который вы анализируете, и я постараюсь найти решения.

22.01.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..