Почти все формы сравнения строк не работают в C ++ 11 - PullRequest
0 голосов
/ 13 марта 2019

Итак, я делаю школьный проект, который требует от меня выполнения моей программы с аргументами и отображения содержимого файла на основе определенного действия. Это делается простым запросом действия после указания имени файла. Это:

. / Имя исполняемого файла 'имя файла' 'действие'

действия включают список или поиск . List перечислит все содержимое книги определенного файла в указанном порядке, а find найдет книгу по указанному номеру ISBN.

Теперь моя ошибка связана с функцией find , а именно с тем, как я сравниваю строки. Я не могу сравнить строки в функции "найти" для жизни меня. Я пытался "strcmp ()" с ".c_str ()", я пытался "==", я пытался "string.copmare (string2)", и ничего. Я разработал некоторые интересные подсказки, хотя.

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

EX:

argv [4] = 0-201-60464-7 рядом здесь

книг [0] .isbn = здесь-60464-7

Файл драйвера

##include"book.h"
#include<iostream>
#include<string>
#include<fstream>
#include<cstring>
using namespace std;

int main(int argc, char** argv)
{
  //The structure of the book will also incorporate an array to
  //acommadate more books
    Book books[35];
    string filename = argv[1];
    int filesRead = read (filename, books);

    if(string(argv[2])== "list")
    {
  for(int index =0;index < filesRead; index++ )
  {
    cout << books[index].title << endl;
    cout << books[index].authorCount<< endl;
    for(int j =0; j < books[index].authorCount; j++)
     {
         cout << books[index].authors[j] << endl;
     }
     cout << books[index].publisher <<endl;
     cout << books[index].yearPublish <<endl;
     cout << books[index].hardcover << endl;
     cout << books[index].price << endl;
     cout << books[index].isbn << endl;
     cout << books[index].copies << endl;
   }
}
if(argc > 3)
{
  if(string(argv[2]) == "find")
  {
    int book_index = find(argv[3], books, filesRead);
    if(book_index < 0)
    {
      cout << "Not found" << endl;
    }
    cout << books[book_index].title << endl;
    cout << books[book_index].authorCount<< endl;
    for(int j =0; j < books[book_index].authorCount; j++)
     {
         cout << books[book_index].authors[j];
     }
     cout << books[book_index].publisher <<endl;
     cout << books[book_index].yearPublish <<endl;
     cout << books[book_index].hardcover << endl;
     cout << books[book_index].price << endl;
     cout << books[book_index].isbn << endl;
     cout << books[book_index].copies << endl;
     }
   }
}

Файл функции

#include"book.h"
#include<iostream>
#include<string>
#include<fstream>
#include<cstring>
using namespace std;
int read (string filename, Book books[])
{
  ifstream inputFile(filename);
  //validation for the file itself
  if(!inputFile)
  {
    cout << "File does not exist!" << endl;
  }
  //use a mix of get line and ifstream
  //created a temporary string to consume lines
  //from primitive data types
  int counter =0;
  string consume_line;

  while(counter < 35 && getline(inputFile, books[counter].title))
  {
    inputFile >> books[counter].authorCount;
    getline(inputFile, consume_line);
      for(int j =0; j < books[counter].authorCount; j++)
       {
           getline(inputFile, books[counter].authors[j]);
       }
    getline(inputFile, books[counter].publisher);
    inputFile >> books[counter].yearPublish;
    inputFile >> books[counter].hardcover;
    inputFile >> books[counter].price;
    getline(inputFile, consume_line);
    getline(inputFile, books[counter].isbn);
    inputFile >> books[counter].copies;
    getline(inputFile, consume_line);
    if(inputFile.eof())
    {
      break;
    }
    counter++;
  }

   return counter;
}
int find(string id, Book books[], int length)
{
  int found=0;
  for(int index = 0; index < length; index++)
  {
    string test =books[index].isbn;
    if(id.compare(test)==0)
    {
      found = index;

      break;
    }
    if(id > test)
    {
      cout << "greater than" << endl;
      found = -1;
      break;
    }
    if(id < test)
    {
      cout << "less than" << endl;
      found =-1;
      break;

    }

  }
  return found;
}

Заголовочный файл

// @file book.h
#ifndef BOOK_H
#define BOOK_H
#include <string>
using namespace std;
const int MAX_AUTHORS = 20;
struct Book {
 string title;
 string authors[MAX_AUTHORS];
 short authorCount;
 string publisher;
 short yearPublish;
 bool hardcover;
 float price;
 string isbn;
 long copies;
};
/**
* @param filename name of the input data file
* @param books[] an array of textbook records read from the file
*
* @return the number of textbook records read
*/
int read (string filename, Book books[]);
/**
* @param id the ISBN number to search for
* @param books[] the list of textbook records
* @param length the number of textbook records in the array
*
* @return the array index of the matching record, otherwise it returns -1
*/
int find (string id, Book books[], int length);
#endif /* BOOK_H */

сокращенный код

e
#include<iostream>
#include<string>
#include<fstream>
#include<cstring>
using namespace std;
const int MAX_AUTHORS = 20;
struct Book {
string title;
string authors[MAX_AUTHORS];
short authorCount;
 string publisher;
 short yearPublish;
 bool hardcover;
 float price;
 string isbn;
 long copies;
};
int read (string filename, Book books[])
{
  ifstream inputFile(filename);
  //validation for the file itself
  if(!inputFile)
  {
    cout << "File does not exist!" << endl;
  }
  //use a mix of get line and ifstream
  //created a temporary string to consume lines
  //from primitive data types
  int counter =0;
  string consume_line;

  while(counter < 35 && getline(inputFile, books[counter].title))
  {
    inputFile >> books[counter].authorCount;
    getline(inputFile, consume_line);
     for(int j =0; j < books[counter].authorCount; j++)
      {
           getline(inputFile, books[counter].authors[j]);
       }
    getline(inputFile, books[counter].publisher);
    inputFile >> books[counter].yearPublish;
    inputFile >> books[counter].hardcover;
    inputFile >> books[counter].price;
    getline(inputFile, consume_line);
    getline(inputFile, books[counter].isbn);
    inputFile >> books[counter].copies;
    getline(inputFile, consume_line);
    if(inputFile.eof())
    {
      break;
    }
    counter++;
  }

   return counter;
}
int find(string id, Book books[], int length) 
{
  int found=0;
  for(int index = 0; index < length; index++)
  {
    string test =books[index].isbn;
    if(id.compare(test)==0)
    {
      found = index;

      break;
    }
    if(id > test)
    {
      cout << "greater than" << endl;
      found = -1;
      break;
    }
    if(id < test)
    {
      cout << "less than" << endl;
      found =-1;
      break;

    }

  }
  return found;
}

int main(int argc, char** argv)
{
  //The structure of the book will also incorporate an array to
  //acommadate more books
    Book books[35];
    string filename = "test3.txt";
    string isbn = "0-201-60464-7";
    int filesRead = read (filename, books);

    int book_index = find(isbn, books, filesRead);
    if(book_index < 0)
    {
        cout << "Not found" << endl;
    }
    cout << books[book_index].title << endl;
    cout << books[book_index].authorCount<< endl;
    for(int j =0; j < books[book_index].authorCount; j++)
    {
       cout << books[book_index].authors[j];
    }
   cout << books[book_index].publisher <<endl;
   cout << books[book_index].yearPublish <<endl;
   cout << books[book_index].hardcover << endl;
   cout << books[book_index].price << endl;
   cout << books[book_index].isbn << endl;
   cout << books[book_index].copies << endl;
  }

тестовый файл в формате TXT или DAT, в зависимости от того, какое расширение предпочтительнее @ File.txt

C++ Network Programming – Volume 1
2
Douglas C. Schmidt
Stephen D. Huston
Addison-Wesley
2002
0
35.99
0-201-60464-7
236

1 Ответ

0 голосов
/ 13 марта 2019
  • с рефакторингом на один модуль компиляции и нулями тестовых файлов.
  • Исправлены логические ошибки
  • добавлены некоторые (надеюсь, пояснительные) комментарии
  • добавлена ​​обработка стиля Windowsокончания строк для повышения мобильности

Примечание. Избегайте использования using namespace в глобальном масштабе.Разумное исключение из этого правила: using namespace std::literals;

#include<iostream>
#include<string>
#include<fstream>
#include<cstring>
#include <sstream>

using namespace std;
const int MAX_AUTHORS = 20;
struct Book {
string title;
string authors[MAX_AUTHORS];
short authorCount;
 string publisher;
 short yearPublish;
 bool hardcover;
 float price;
 string isbn;
 long copies;
};

void strip(std::string& str)
{
    if (str.size() && str.back() == '\r')
    {
        str.pop_back();
    }
}

std::istream& get_line_and_strip(std::istream& is, std::string& result)
{
    std::getline(is, result);
    strip(result);
    return is;
}

// be specific about the bounds of the output variable.
int read (std::istream& inputFile, Book books[35])
{
  //validation for the file itself
  if(!inputFile)
  {
    std::cout << "File does not exist!" << std::endl;
    // avoid UB by returning a value as per the function signature
    return 0;
  }

  //use a mix of get line and ifstream
  //created a temporary string to consume lines
  //from primitive data types
  int counter =0;
  std::string consume_line;

  while(counter < 35)
  {
    get_line_and_strip(inputFile, books[counter].title);
    inputFile >> books[counter].authorCount;
    std::getline(inputFile, consume_line);
    for(int j =0; j < books[counter].authorCount; j++)
    {
        get_line_and_strip(inputFile, books[counter].authors[j]);
    }
    get_line_and_strip(inputFile, books[counter].publisher);
    inputFile >> books[counter].yearPublish;
    std::getline(inputFile, consume_line);
    inputFile >> books[counter].hardcover;
    std::getline(inputFile, consume_line);
    inputFile >> books[counter].price;
    std::getline(inputFile, consume_line);
    get_line_and_strip(inputFile, books[counter].isbn);
    inputFile >> books[counter].copies;
    std::getline(inputFile, consume_line);
    if(!inputFile) // tests for EOF or error during input
    {
      break;
    }
    counter++;
  }

   return counter;
}
int find(string id, Book books[35], int length) 
{
  int found=0;
  for(int index = 0; index < length; index++)
  {
    string test =books[index].isbn;
    if(id.compare(test)==0)
    {
      found = index;

      break;
    }
    if(id > test)
    {
      cout << "greater than" << endl;
      found = -1;
      break;
    }
    if(id < test)
    {
      cout << "less than" << endl;
      found =-1;
      break;

    }

  }
  return found;
}

auto test_data = ""
"C++ Network Programming – Volume 1\r\n"
"2\r\n"
"Douglas C. Schmidt\r\n"
"Stephen D. Huston\r\n"
"Addison-Wesley\r\n"
"2002\r\n"
"0\r\n"
"35.99\r\n"
"0-201-60464-7\r\n"
"236\r\n"
""s;

int main(int argc, char** argv)
{
    //The structure of the book will also incorporate an array to
    //acommadate more books
    Book books[35];
    string filename = "test3.txt";
    string isbn = "0-201-60464-7";
    auto test_file = std::istringstream(test_data);
    int filesRead = read (test_file, books);

    int book_index = find(isbn, books, filesRead);
    if(book_index < 0)
    {
        cout << "Not found" << endl;
        // would be invalid to continue if book not found
        return 0;
    }
    cout << books[book_index].title << endl;
    cout << books[book_index].authorCount<< endl;
    for(int j =0; j < books[book_index].authorCount; j++)
    {
        cout << books[book_index].authors[j] <<endl;
    }
    cout << books[book_index].publisher <<endl;
    cout << books[book_index].yearPublish <<endl;
    cout << books[book_index].hardcover << endl;
    cout << books[book_index].price << endl;
    cout << books[book_index].isbn << endl;
    cout << books[book_index].copies << endl;
}

Ожидаемый результат:

C++ Network Programming – Volume 1
2
Douglas C. Schmidt
Stephen D. Huston
Addison-Wesley
2002
0
35.99
0-201-60464-7
236

https://coliru.stacked -crooked.com / a / 9b08598ffcd0edc2

...