Передача файла через аргумент команды в массив - PullRequest
0 голосов
/ 29 апреля 2020

Итак, я пытаюсь передать аргумент командной строки в массив в моей главной директории типа int, например, $< .\program nums.txt 8, но я получаю ошибки и захожу в тупик со своими знаниями о коде C ++. (Я относительно новый кодер). Любая помощь с благодарностью.

 int main(int argc,char *argv[])
    {
        string arg2=" ";
        arg2 = argv[2];
        int size; 
        size=stod(arg2);
        string arr[size];
        string file = argv[1];
        ifstream infile;
        if (getline infile.open(file))
        {
            int arr[size],val;
            for(int i=0;i<size;i++)
            {
                getline(file, arr[i]);
            }
        }
    int choice = 5,value,position,target ;

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

Это список ошибок, которые у вас есть (за исключением отсутствующей фигурной скобки в конце, отсутствующие включают в себя [вы, вероятно, просто не опубликовали их?] И отсутствующие std:: [использование using namespace std; - * 1003) * считается плохой практикой ]) и, в основном, как их исправить:

  • std::stod анализирует и возвращает dobule, но вы присваиваете результат int.

    size = std::stod(arg2);
    

    вы, вероятно, намеревались использовать stoi:

    size = std::stoi(arg2); 
    
  • VLA (массивы переменной длины), такие как

    std::string arr[size]; 
    

    являются не является частью стандарта C ++ . Вместо этого используйте

    std::vector<std::string> arr(size);
    
  • При открытии файлового потока ваше намерение верно, но синтаксис неправильный

    std::ifstream infile;
    if (std::getline infile.open(file))
    

    должно быть

    std::ifstream infile(file);
    if (infile)
    
  • Внутри if у вас есть

    int arr[size],val;
    

    две неиспользованные переменные, другая VLA и, что наиболее важно, int arr[size] будет shadow string arr[size].

  • Вот причина следующих ошибок:

    std::getline(file, arr[i]);
    

    Первый параметр file - это std::string, это должно быть явно infile. Из-за переменной затенения второй параметр arr[i] будет ссылаться на int arr[i]. Переименуйте одну из них или просто удалите две неиспользуемые переменные (см. Последний пункт).

  • Всегда проверяйте, было ли чтение успешным. Если вы хотите прочитать максимум size строк, используйте

    for(int i = 0; i < size && std::getline(infile, arr[i]); i++);
    

    Это приведет к завершению l oop, если getline не получится по какой-то причине, например, когда файл имеет значение меньше size строк.

Наконец, вы можете подумать о некоторой проверке. Например, проверьте, действительно ли заданы два параметра командной строки, и добавьте блок try-catch вокруг stoi.

И просто упомяну это: изучать C ++, угадывая, не весело. На https://en.cppreference.com/w/ вы можете найти обширную информацию и множество примеров функций и классов, которые вы хотите использовать.

1 голос
/ 29 апреля 2020

В вашем вопросе много опечаток. Тем не менее, я думаю, что этот код может помочь вам:

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

int main(int argc, char *argv[]) {
    int size = atoi(argv[2]);
    std::vector<std::string> arr(size);
    std::ifstream infile(argv[1]);
    if (not infile) {
        std::cerr << "File not found!" << std::endl;
        return -1;
    }
    for (int i = 0; i < size; i++)
        if (infile)
            std::getline(infile, arr[i]);
        else {
            std::cerr << "Not enough lines in the file!" << std::endl;
            return -2;
        }
    // do rest of your things here ...
    return 0;
}
...