istream открывает файл .txt, но не собирает текст внутри файла - PullRequest
0 голосов
/ 20 марта 2019

редактировать: РАЗРЕШЕНО.Переместил ins >> val на предшествующий цикл, затем поставил ins.fail() в качестве условия.Я не совсем уверен, почему это помогло, но это помогло, и я с удовольствием буду двигаться вперед.

Оригинальный пост:

У меня проблема с кодом ниже.По какой-то причине он читает в file.txt и возвращается так же хорошо, но istream читает ввод, как если бы файл был пустым.Для справки, я работаю в Xcode.Я пытался поиграть со схемой, но ничего не получается.Я просто не понимаю, как он успешно читает в файле (я проверяю часть кода ... и он говорит, что файл был успешно открыт), но пока не извлекает ни один из входных данных.

#include <iostream>
#include <fstream>
using namespace std;

int main() {  
    ifstream inFile;
    inFile.open("file.txt");

    // There exists a class called Position that isn't important for
    // this but just clarifying
    Position pos;
    pos.read(inFile);

    return 0;
}

void read(istream& ins) {
    int val;
    char discard;
    while (!(ins >> val)) {
        ins.clear();
        ins >> discard;
    }
}

Я относительно новичок в этом, кодирую только около 6 месяцев.Буду очень признателен за любые объяснения.Спасибо, ребята!

edit: цель этого кода - получить входные данные из файла в виде целых чисел.Если на входе есть что-то отличное от int, цикл вернется в нормальное состояние и получит не-int как char.Меня не волнует тот факт, что фактический текст файла, похоже, исчезает.Код был предоставлен в первую очередь для небольшого контекста.

Извинения за отсутствие знакомства со стеком!

edit2: Если я запускаю цикл следующим образом:

while (!(ins >> val)) {
    ins.clear();
    ins >> discard;
    cout << discard;
}

Это входит в бесконечный цикл, потому что нет входных данных из файла.Не совсем уверен, как я мог бы показать I / O для этого, так как проблема в том, что нет никакого ввода и, следовательно, нет вывода.Когда я тестирую, он просто работает, работает и работает, пока я не остановлю его.Фактический файл .txt НЕ пуст, но он как-то обрабатывается так, как будто он есть.

edit3: добавление еще нескольких строк в качестве попытки выяснить, что именно происходит.

Спасибоеще раз!

1 Ответ

0 голосов
/ 21 марта 2019

Вот короткий пример, который показывает:

  • Как читать строки в файле
  • Как проверить конец файла
  • Как записать в файл
  • Как добавить файл, который уже существует

Надеюсь, это прояснит ситуацию. На вопрос было немного сложно ответить напрямую, потому что вы никогда не объясняете, что такое ins.

#include <fstream>
#include <iostream>
#include <vector>
#include <string>

using std::string; 
using std::ifstream; 
using std::ofstream; 
using std::vector; 

void append_to_file(string const& filename, string const& text) 
{
    // Open the file in append mode
    ofstream file(filename, std::ios_base::app);
    // Write the text to the file
    file << text; 
}
void write_to_file(string const& filename, string const& text) 
{
    // Clear the file and open it
    ofstream file(filename); 
    file << text; 
}

// Read all the lines in the file
vector<string> read_all_lines(string const& filename)
{
    ifstream file(filename); 

    vector<string> lines;
    while(not file.eof() && not file.fail()) {
        // Get the line
        std::string line;
        std::getline(file, line);
        // Add the line into the vector
        lines.push_back(std::move(line)); 
    }
    return lines; 
}
int main() 
{
    string filename = "test-file.txt"; 

    // Clear the file and write 
    write_to_file(filename, "This is a sentence.\n"); 

    // Append some additional text to the file: 
    append_to_file(filename, "This is some additional text"); 

    // Read all the lines in the file we wrote: 
    vector<string> lines = read_all_lines(filename); 

    // Print the lines we read: 
    for(auto& line : lines) {
        std::cout << line << '\n'; 
    }
}
...