Сначала сделайте ifstream
:
#include <fstream>
std::ifstream infile("thefile.txt");
Два стандартных метода:
Предположим, что каждая строка состоит из двух чисел и считывает токен токеном:
int a, b;
while (infile >> a >> b)
{
// process pair (a,b)
}
Разбор строк с использованием потоков строк:
#include <sstream>
#include <string>
std::string line;
while (std::getline(infile, line))
{
std::istringstream iss(line);
int a, b;
if (!(iss >> a >> b)) { break; } // error
// process pair (a,b)
}
Вы не должны смешивать (1) и (2), так как синтаксический анализ на основе токенов не сожирает новые строки, поэтому вы можете получить ложные пустые строки, если будете использовать getline()
после того, как извлечение на основе токенов привело вас к концу линия уже.
int a, b; char c; while ((infile >> a >> c >> b) && (c == ','))
while(getline(f, line)) { }
конструкции и относительно обработки ошибок, пожалуйста, взгляните на эту (мою) статью: gehrcke.de/2011/06/… (я думаю, что мне не нужно с совестью публиковать это здесь, это даже немного предварительно даты этого ответа).Используйте
ifstream
для чтения данных из файла:Если вам действительно нужно читать построчно, сделайте следующее:
Но вам, вероятно, просто нужно извлечь пары координат:
Обновить:
В вашем коде вы используете
ofstream myfile;
, однакоo
вofstream
означаетoutput
. Если вы хотите прочитать из файла (вход), используйтеifstream
. Если вы хотите и читать, и писать, используйтеfstream
.источник
getline
находится вstring
Престоле , так что не забывайте#include <string>
Чтение файла строка за строкой в C ++ может быть сделано несколькими различными способами.
[Быстрый] Цикл с std :: getline ()
Самый простой подход - открыть std :: ifstream и цикл с использованием вызовов std :: getline (). Код чистый и понятный.
[Быстро] Используйте Boost's file_description_source
Другая возможность - использовать библиотеку Boost, но код становится немного более подробным. Производительность очень похожа на приведенный выше код (цикл с std :: getline ()).
[Самый быстрый] Используйте код C
Если производительность важна для вашего программного обеспечения, вы можете рассмотреть возможность использования языка C. Этот код может быть в 4-5 раз быстрее, чем версии C ++ выше, см. Тест ниже
Тест - Какой из них быстрее?
Я сделал несколько тестов производительности с кодом выше, и результаты интересны. Я проверил код с файлами ASCII, которые содержат 100 000 строк, 1 000 000 строк и 10 000 000 строк текста. Каждая строка текста содержит в среднем 10 слов. Программа скомпилирована с
-O3
оптимизацией, и ее выходные данные передаются/dev/null
, чтобы удалить переменную времени регистрации из измерения. И последнее, но не менее важное: каждый фрагмент кода регистрирует каждую строку с помощьюprintf()
функции согласованности.Результаты показывают время (в мс), которое потребовалось каждому фрагменту кода для чтения файлов.
Разница в производительности между двумя подходами C ++ минимальна и не должна иметь никакого значения на практике. Производительность кода C - это то, что делает эталон впечатляющим и может повлиять на скорость игры.
источник
std::cout
противprintf
.printf()
функцию во всех случаях для согласованности. Я также пытался использоватьstd::cout
во всех случаях, и это не имело никакого значения. Как я только что описал в тексте, выходные данные программы идут/dev/null
так, что время для печати строк не измеряется.cstdio
. Вы должны были попробовать с настройкойstd::ios_base::sync_with_stdio(false)
. Я предполагаю, что вы получили бы намного лучшие результаты (хотя это не гарантировано, поскольку это определяется реализацией, когда синхронизация отключена).Поскольку ваши координаты принадлежат парам, почему бы не написать для них структуру?
Затем вы можете написать перегруженный оператор извлечения для istreams:
И тогда вы можете прочитать файл координат прямо в вектор, как это:
источник
int
токена из потокаoperator>>
? Как можно заставить его работать с анализатором обратного отслеживания (т.operator>>
Е. Когда происходит сбой, откатить поток до предыдущей позиции и вернуть значение false или что-то в этом роде)?int
токена, тогдаis
поток оцениваетсяfalse
и цикл чтения завершается в этой точке. Вы можете обнаружить этоoperator>>
, проверив возвращаемое значение отдельных чтений. Если вы хотите откатить поток, вы бы позвонилиis.clear()
.operator>>
правильнее сказать,is >> std::ws >> coordinates.x >> std::ws >> coordinates.y >> std::ws;
так как в противном случае вы предполагаете, что ваш входной поток находится в режиме пропуска пробелов.Расширение на принятый ответ, если ввод:
вы все равно сможете применить ту же логику, например так:
источник
Хотя нет необходимости закрывать файл вручную, но лучше сделать это, если область действия переменной файла больше:
источник
Этот ответ предназначен для Visual Studio 2017, и если вы хотите прочитать из текстового файла, какое расположение относительно вашего скомпилированного консольного приложения.
сначала поместите ваш текстовый файл (в данном случае test.txt) в папку вашего решения. После компиляции сохраните текстовый файл в той же папке с applicationName.exe
C: \ Users \ "Имя пользователя" \ Source \ Repos \ "solutionName" \ "solutionName"
источник
Это общее решение для загрузки данных в программу на C ++ с использованием функции readline. Это может быть изменено для файлов CSV, но разделитель здесь - пробел.
источник