ошибка при чтении файла getline [c++] MS VS2010 [закрыт]

225
06 февраля 2019, 04:40

Появляется ошибка при чтении файла на getline в MS VS2010 появляется ошибка на while( in.getline(buf, 1024) ){ при чтении пустой строки, а именно при чтении символов перевода строки \r\n.

Подскажите пожалуйста в чем косяк....?
пример строк из файла "input.txt":

angliyskie.bukvi.cifri1="русские буквы цифры1";

\r\n (в этом месте ломается. не знаю как тут пустую строку оформить)

angliyskie.bukvi.cifri2="русские буквы цифры2";

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <sstream>
#include <stdio.h>
#include <string>
std::ifstream in("input.txt");
std::ofstream out("output.txt");
char str1[80] = {0};
char str2[80] = {0};
int main()
{
char buf[1024]={0};
while( in.getline(buf, 1024) ){
      string str(buf);
      if (sscanf(buf, "%[*a-z,*0-9,A-z,., ]%*c%[^\n]s", &str1, str2)== 1){
          if (str1[0]=='/'){
              goto breakAll;
          }
          else if (str1[0]==' '){
              goto breakAll;
          }
           else if (str1[0]==NULL){
              goto breakAll;
          }
          else if (str1[0]=='\n'){
              goto breakAll;
          }
          else if (str1[0]=='\r'){
              goto breakAll;
          }
          else (out << str1<<endl);
        str1[0]=0;
        str2[0]=0;
        str=' ';}
breakAll:;
  buf[0]=0;}
    out.close();
    in.close();
}
Answer 1

Во-первых, зачем понадобилась мешанина из С ввода-вывода и классов строк С++ - не ясно. Ну да ладно...

Во-вторых, в sscanf написана какая-то белиберда

  1. Формат %[*a-z,*0-9,A-z,., ] - вызывает обоснованные подозрения на бессмыcлицу. Это выглядит как попытка прочитать буквы, цифры, символ пробела и точку. Тогда правильный формат будет выглядеть так

    %[A-Za-z0-9. ]

    Зачем вы там понаставили запятых и в чем сакаральный смысл этих * - не ясно.

  2. Что делает какая-то s в конце строки формата? Эта s - совершенно отдельный самостоятельный символ в строке формата, который приведет к тому, что sscanf будет требовать, чтобы каждая ваша строка заканчивалась на s. Вам это действительно нужно?

    Это больше всего похоже на периодически встречающееся странное верование, что формат %[] на самом деле пишется как %[]s, что, разумеется, является чушью. Особенно странно это видеть в вашем коде, где после первого %[] у вас нет никакого s, а после второго вы вдруг решили его поставить. Что это за метания?

  3. Что за странный зоопарк из аргументов-приемников для sscanf

    , &str1, str2)

    Почему вдруг в первом аргументе появилась эта &?

  4. Результат sscanf сравнивается с 1. Почему именно с 1, если фактически читается два аргумента. Вы хотели потребовать, чтобы чтение второго аргумента было безуспешным? Или что-другое?

  5. Переменная buf объявлена локально в main, а все остальные - на уровне файла. На основе какой логики принимались решения о том, где объявлять переменные?

  6. Строка str2 читается, но нигде в коде не используется. Зачем вы тогда вообще заводили буфер str2 и что-то в него читали? По вашему sscanf (формат %*c) видно, что вы знаете, какую роль играет символ * в подавлении присваивания. Почему тогда вы не воспользовались им и для третьего формата?

  7. if (str1[0]==NULL) - еще одно непонятное сравнение. str[0] - значение типа char. NULL предназначено для использования с указателями. Что вы хотели сказать этим сравнением?

READ ALSO
std::conditional параметр в конструкторе

std::conditional параметр в конструкторе

Пытаюсь написать класс, реализующий одновременно константный и неконстантый итератор как показано здесь

187
При вводе чисел не меняется значение выражения

При вводе чисел не меняется значение выражения

Когда ввожу разные значения с клавиатуры, значения не меняютсяКак испраить данную ошибку?

211
Чередование двух массивов java

Чередование двух массивов java

Элементы двух массивов нужно поочередно занести в 3 массивК примеру массивы A(n) и B(n) нужно записать как C(a1, b1, a2, b2, a3, b3)

252