Появляется ошибка при чтении файла на 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 предназначено для использования с указателями. Что вы хотели сказать этим сравнением?
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости