#c #readfile
#c #readfile
Вопрос:
если у меня есть такой файл, скажем, вызывается file.txt
20
25 97
97 5
Как мне правильно прочитать его, учитывая, что во втором столбце отсутствует второй элемент в первой строке?Я попытался это
int main()
{
ifstream readFile;
string filename;
cout << "Please enter file name and extention: " << endl;
cin >> filename;
readFile.open(filename);
int row = 0;
int column = 0;
while (readFile >> row >> column)
{
//does something
}
Однако я получаю ошибку сегментации
Комментарии:
1. Полностью зависит от того, что вы подразумеваете под словом «правильно». Что вы ожидаете, когда одно из чисел отсутствует?
Ответ №1:
Я хотел бы использовать std::getline
для чтения строк и std::stringstream
анализа строк.
#include <iostream>
#include <fstream>
#include <sstream>
int main(void) {
std::string filename;
std::string line;
std::ifstream readFile;
std::cout << "Please enter file name and extention: " << std::endl;
std::cin >> filename;
readFile.open(filename);
if (!readFile) {
std::cout << "open errorn";
return 1;
}
while (std::getline(readFile, line)) {
std::stringstream ss(line);
int row = 0, column = 0;
if (ss >> row >> column) {
std::cout << "row = " << row << ", column = " << column << 'n';
} else {
std::cout << "invalid linen";
}
}
readFile.close();
return 0;
}
Другая версия (также печатает частичную строку):
#include <iostream>
#include <fstream>
#include <sstream>
int main(void) {
std::string filename;
std::string line;
std::ifstream readFile;
std::cout << "Please enter file name and extention: " << std::endl;
std::cin >> filename;
readFile.open(filename);
if (!readFile) {
std::cout << "open errorn";
return 1;
}
while (std::getline(readFile, line)) {
std::stringstream ss(line);
int row = 0, column = 0;
bool row_valid = false, column_valid = false;
if (ss >> row) row_valid = true;
if (ss >> column) column_valid = true;
std::cout << "row = ";
if (row_valid) std::cout << row; else std::cout << "(none)";
std::cout << ", column = ";
if (column_valid) std::cout << column; else std::cout << "(none)";
std::cout << 'n';
}
readFile.close();
return 0;
}
Еще одна версия (поддержка строк с 3 целыми числами и более):
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
int main(void) {
std::string filename;
std::string line;
std::ifstream readFile;
std::cout << "Please enter file name and extention: " << std::endl;
std::cin >> filename;
readFile.open(filename);
if (!readFile) {
std::cout << "open errorn";
return 1;
}
while (std::getline(readFile, line)) {
std::stringstream ss(line);
std::vector<int> lineInts;
int data;
while (ss >> data) lineInts.push_back(data);
std::cout << lineInts.size() << " elements:";
for (int d : lineInts) std::cout << ' ' << d;
std::cout << 'n';
}
readFile.close();
return 0;
}
Комментарии:
1. что, если я все еще хочу прочитать недопустимую строку? Скажем, строка = 20 столбцов = пусто
2. @davidlingg2000 добавил эту версию.