I got this code from notes about file handling. From what I understand about this code, I want to get characters till x is reached in the file using this code. Why am I getting only the first character? If this code is incorrect, how should I alter the code to get characters till x is reached? Please help me understand this.<
#include<iostream>
#include<fstream>
#include<string.h>
#include<string>
using namespace std;
int main()
{
char a = '-';
do
{
ifstream obj("test.txt", ifstream::in);// in would mean import from txt to ram
// cout << obj << endl;
if (obj.good() && a != obj.peek())
{
a = obj.getline();
cout << a << endl;
}
obj.close();
} while (a != 'x');
return 0;
}
@anastaciu извините, мой плохой, это должно было быть a= obj.get().
Подумайте, когда и где вы открываете и закрываете файл.
@ChrisMM, поскольку цикл завершится, когда a = x, не должна ли отображаться вся строка текстового файла перед символом x?
@ChrisMM он скомпилировался один раз. Я сделал текстовый файл с именем test и написал «Hello x Hi». На консоли отображалось только H.
a
— это символ, а std::getline()
возвращает istream
. Здесь нет ничего неправильного? Вы не можете присвоить istream
char
, поэтому код даже не компилируется.
Вы можете упростить свой код до этого рабочего примера:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
ifstream obj("test.txt", ifstream::in);
if (obj.good())
{
std::string line;
while (std::getline(obj, line))
{
for (auto& i : line)
{
if (i == 'x') return 0;
cout << i << endl;
}
}
}
obj.close();
return 0;
}
This is
a
test fixle
T
h
i
s
i
s
a
t
e
s
t
f
i
почему после This есть пробел, а не после is, a и test?
Потому что между ними нет пробела в файле. This is
стоит в одной строке, а test
— в другой.
obj.getline()
недействителен. Я вижу в ваших комментариях, что вы хотели написать obj.get()
, поэтому я буду использовать это.
Основная проблема заключается в том, что вы открываете и закрываете файл в своем цикле do-while
, а это означает, что для каждой итерации вы будете открывать файл, читать символ, а затем закрывать файл. Каждый раз, когда вы открываете файл, вы фактически начинаете с самого начала, и поэтому вы не будете читать, пока не доберетесь до символа 'x'
, а в основном бесконечно.
Я не проверял это, но, похоже, это то, что вы хотите (добавлены комментарии):
#include<iostream>
#include<fstream>
#include<string>
int main()
{
std::ifstream obj("test.txt"); // open the file (no need to specify "in")
if ( !obj ) { // check to see if the file could be opened
std::cout << "Could not open file\n";
} else {
char a;
while ( obj >> a ) { // while there's still something to read
if ( a != 'x' ) { // if it's not an 'x' character, print it
std::cout << a << std::endl;
} else {
break; // otherwise, break the loop
}
}
obj.close(); // close the file
}
return 0;
}
Является ли if (!obj) таким же, как если бы(obj.is_open())
Более или менее, да. if ( !obj )
проверяет наличие ошибок в потоке, а не просто проверяет, открыт ли он. В этом контексте это будет то же самое, что и obj.is_open()
. Дополнительную информацию можно найти здесь
О, это имеет смысл! Большое спасибо за помощь!
a
— этоchar
, он может содержать только один символ. Кроме того, вы открываете и закрываете файл в каждой итерации цикла, что означает, что вы каждый раз читаете файл с самого начала. Кроме того, ваш код даже не скомпилируется, поэтому я не знаю, откуда вы это взяли или как вы пытались его использовать...