Появляется ошибка при чтении файла на 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();
}
Во-первых, зачем понадобилась мешанина из С ввода-вывода и классов строк С++ - не ясно. Ну да ладно...
Во-вторых, в sscanf
написана какая-то белиберда
Формат %[*a-z,*0-9,A-z,., ]
- вызывает обоснованные подозрения на бессмыcлицу. Это выглядит как попытка прочитать буквы, цифры, символ пробела и точку. Тогда правильный формат будет выглядеть так
%[A-Za-z0-9. ]
Зачем вы там понаставили запятых и в чем сакаральный смысл этих *
- не ясно.
Что делает какая-то s
в конце строки формата? Эта s
- совершенно отдельный самостоятельный символ в строке формата, который приведет к тому, что sscanf
будет требовать, чтобы каждая ваша строка заканчивалась на s
. Вам это действительно нужно?
Это больше всего похоже на периодически встречающееся странное верование, что формат %[]
на самом деле пишется как %[]s
, что, разумеется, является чушью. Особенно странно это видеть в вашем коде, где после первого %[]
у вас нет никакого s
, а после второго вы вдруг решили его поставить. Что это за метания?
Что за странный зоопарк из аргументов-приемников для sscanf
, &str1, str2)
Почему вдруг в первом аргументе появилась эта &
?
Результат sscanf
сравнивается с 1
. Почему именно с 1
, если фактически читается два аргумента. Вы хотели потребовать, чтобы чтение второго аргумента было безуспешным? Или что-другое?
Переменная buf
объявлена локально в main
, а все остальные - на уровне файла. На основе какой логики принимались решения о том, где объявлять переменные?
Строка str2
читается, но нигде в коде не используется. Зачем вы тогда вообще заводили буфер str2
и что-то в него читали? По вашему sscanf
(формат %*c
) видно, что вы знаете, какую роль играет символ *
в подавлении присваивания. Почему тогда вы не воспользовались им и для третьего формата?
if (str1[0]==NULL)
- еще одно непонятное сравнение. str[0]
- значение типа char
. NULL
предназначено для использования с указателями. Что вы хотели сказать этим сравнением?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Пытаюсь написать класс, реализующий одновременно константный и неконстантый итератор как показано здесь
Когда ввожу разные значения с клавиатуры, значения не меняютсяКак испраить данную ошибку?
Есть поиск в коллекции:
Элементы двух массивов нужно поочередно занести в 3 массивК примеру массивы A(n) и B(n) нужно записать как C(a1, b1, a2, b2, a3, b3)