Разбор текстового файла C ++

0

Я пытаюсь проанализировать текстовый файл в c++, чтобы прочитать числа, которые содержатся в файле. Число целых чисел на каждой строке и количество строк не известно. Когда все целые числа будут прочитаны, они сохраняют это целое число, за которым следует "," и текущее количество этой строки. Затем это будет выведено в файл, выбранный пользователем. Код, который я написал, выглядит следующим образом:

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

using namespace std;

int main()
{
int i=0,b = 0,num = 100;
int *s1;
string myfilename, mystring, filename;

cout << "Enter the name of the file to open:" << endl;
cin >> myfilename;
cout << "Enter the name of the output file" << endl;
cin >> filename;

ifstream inFile;
ofstream outFile("C:\\Users\\Aidan Howie\\Documents\\University\\Second Year\\C++\\" + filename + ".txt");

inFile.open("C:\\Users\\Aidan Howie\\Documents\\University\\Second Year\\C++\\" + myfilename + ".txt");
if (!inFile)
{
    cout << "Cannot open file" << endl;
    return -1;
}
while (!inFile.eof())
{
    s1 = new int[num];
    for (i = 0; i < s1; i++)
    {
        cout << i << "," << (i + b) / s1;
        b = i+b;
        cout << endl;
    }

}

inFile.close();
system("PAUSE");

}

Однако получите ошибку:

error C2446: '<' : no conversion from 'int *' to 'int'  

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

  • 2
    Ошибка проста, вы не можете преобразовать указатель в целое число в целое число. Если вы хотите использовать значения int в указателе int, вы должны использовать *si или si[index] . Также я не вижу, чтобы вы устанавливали какие-либо значения на s1 . Вы только инициализируете его оператором new, который может выдавать 0 или значения мусора.
  • 0
    Ничто из того, что вы делаете в цикле while, не имеет для меня большого смысла. Попробуйте пойти шаг за шагом, если вы не уверены, как это сделать. 1) Попробуйте прочитать каждую строку из файла и вывести то, что вы прочитали, в cout. 2) попробуйте прочитать файл с одним целым числом в каждой строке и вывести числа, которые вы прочитали. 3) попробуйте записать числа, которые вы прочитали в 2, в выходной файл. 4) попробуйте прочитать в файле «число, число» в каждой строке и вывести только вторую 5) вывести сумму двух значений в каждой строке из 4. 6) выполнить задание, которое у вас есть
Теги:
arrays
text-parsing

2 ответа

0

s1 - это массив из ints, что означает, что когда вы используете имя s1 без индекса, это указатель. Следовательно, ваше сравнение i < s1 спрашивает, является ли i меньше, чем адрес s1, и это не действительное сравнение. Ваша строка кода должна выглядеть так:

for (i = 0; i < num; i++)

Кроме того, inFile.eof() не делает то, что вы считаете. Единственный способ, которым вы собираетесь получить EOF в inFile - это тип пользователя ctrl + D. У вас должен быть пользователь, который вводит какое-то контрольное значение, чтобы сигнализировать о конце ввода; например, 0 или -1 или другое другое недопустимое значение.

  • 0
    По сути, я пытаюсь подсчитать, сколько целых чисел в файле, а затем вывести первое число, за которым следует ',' с итоговой суммой чисел в строке. Теперь я вижу, что мой код ничего не делает по этим строкам, но есть ли способ сделать это?
  • 0
    @ user3364345 вы ни в коем случае не читаете никаких данных из inFile , это было бы хорошим началом
Показать ещё 4 комментария
0

s1 - указатель на int, а i - int. Таким образом, по существу, вы делаете проверку, если 6 < 0x55ddab.

Правильный способ сделать это: i < *s1

Кроме того, не забудьте delete s1 до повторения цикла while.

Кроме того, я просто хочу отметить, что то, что вы делаете, не имеет смысла, тем не менее, используя i < *s1 вы исправите свою ошибку.

  • 1
    i < *s1 тоже не имеет смысла.
  • 0
    @CareyGregory, сам по себе, зная, что s1 - указатель на целое число, а i - целое число, имеет смысл. Он берет int i и int, на которые указывает s1 и сравнивает их.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню