Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.04.2010, 20:20   #1
nerdo
Новичок
Джуниор
 
Регистрация: 29.04.2010
Сообщений: 4
По умолчанию Правильное чтение из файла!

Помогите пожалуйста, уже опробовал все(((
Суть задачи такая, есть файл data.txt в нем есть числа выглядит он так:
Цитата:
200,100,100,
100,
300
Ниже представлен код программы, которая просит ввести путь к файлу читает его и суммирует содержимое данного файла, сумма выводиться на экран.
Проблема в том, что программа читает первую строчку а остальные не читает.
Помогите дополнить код так чтобы были прочитаны все строчки.
Я буду очень благодарен, т.к. я сам не программист и несильно в этом разбираюсь.


Цитата:
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>

using namespace std;

LONG Sum = 0; // Глобальная переменная для суммы элементов вектора

// Объявление структуры Вектор (с псевдонимом ВЕКТОР)
typedef struct Vector
{
int *data; // элементы вектора
int count; // количество элементов
} VECTOR;

// Функция потока
DWORD WINAPI ThreadFunc(LPVOID vect)
{
VECTOR* vec;
vec = (VECTOR*)vect;
int vecsum = 0;
for(int i = 0; i < vec->count; i++)
vecsum += vec->data[i];
InterlockedExchangeAdd(&Sum, vecsum);
}

int main(void)
{
VECTOR vecf, *vect; // структура для общего вектора, считанного с файла, и для массива векторов для потоков
DWORD *dwThreadIds, dwThreadsCount, dwElemInThread; //массив идентификаторов потока, кол-во потоков, кол-во элементов в потоке соответсвенно
HANDLE *hThread; //массив дескрипторов потока
FILE *hFile; // дескриптор открываемого файла
char *tmp; // строка для имени файла и для его содержимого
BOOL parity; // четность деления кол-ва потоков и кол-ва элементов

vecf.count = 0;
cout << "Enter full path to file" << endl << "> ";
cin >> tmp;
delete [] tmp;

hFile = fopen(tmp, "rt");
if (hFile == NULL)
{
cout << "Error: Invalid filename." << endl;
return 1;
}
fseek(hFile, 0, SEEK_END); // file
int fsize = ftell(hFile) + 1; // bytes
fseek(hFile, 0, SEEK_SET); // count
tmp = new char[fsize];
fgets(tmp, fsize, hFile);
for (int i = 0; tmp[i] != '\0'; i++) // подсчет запятых в строке (для подсчета элементов вектора)
if(tmp[i] == ',') vecf.count++;
vecf.data = new int[vecf.count+1]; // memory alloc for vector data ( ',' count = 5, elements count = 5+1)
cout << "Given vector: ";
vecf.count = 0;
// Разбиение строки на элементы (с использованием разделителя ",")
vecf.data[0] = atoi(strtok(tmp, ",")); // atoi - перевод строки в число
while (vecf.data[vecf.count] != '\0')
{
cout << vecf.data[vecf.count] << " ";
vecf.count++;
vecf.data[vecf.count] = atoi(strtok(NULL, ","));
}
delete [] tmp;

cout << endl << "Elements count: " << vecf.count << endl;
cout << "Enter threads count: " << endl << "> ";
cin >> dwThreadsCount;
if (dwThreadsCount > vecf.count)
{
cout << "Error: Enter number of threads less than number of elements." << endl;
return 2;
}

vect = new VECTOR[dwThreadsCount];
dwThreadIds = new DWORD[dwThreadsCount];
hThread = new HANDLE[dwThreadsCount];
if (vecf.count % dwThreadsCount == 0) // определяем, четно ли делится кол-во элементов на кол-во потоков
parity = TRUE;
else
parity = FALSE;
dwElemInThread = vecf.count / dwThreadsCount;
int offset = 0;
for (unsigned int a = 0; a < dwThreadsCount; a++)
{
if (a == 0 && parity == FALSE) vect[a].count = dwElemInThread + (vecf.count % dwThreadsCount);
else vect[a].count = dwElemInThread;
vect[a].data = new int[vect[a].count];
for (int j = 0; j < vect[a].count; j++)
vect[a].data[j] = vecf.data[j+offset];
offset += vect[a].count;
hThread[a] = CreateThread(NULL, 0, ThreadFunc, &vect[a], 0, &dwThreadIds[a]); //создание потока
}

WaitForMultipleObjects(dwThreadsCou nt, hThread, TRUE, INFINITE); // wait for thread ending
cout << "Sum of elements = " << Sum << endl;
for (unsigned int a = 0; a < dwThreadsCount; a++)
delete [] vect[a].data;
delete [] vecf.data;
delete [] vect;
delete [] dwThreadIds;
delete [] hThread;
fclose(hFile);
_getch();
return 0;
}
nerdo вне форума Ответить с цитированием
Старый 29.04.2010, 21:31   #2
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

такой код для такой простой задачи... ужас
NiCola999 вне форума Ответить с цитированием
Старый 29.04.2010, 21:57   #3
nerdo
Новичок
Джуниор
 
Регистрация: 29.04.2010
Сообщений: 4
По умолчанию

NiCola999
Да это смешно, просто у нас все хотят чтобы это все делалось через потоки и Interlocked функции. Ну а та задача которая стоит она типа простая, хотя я не могу ее сделать((
nerdo вне форума Ответить с цитированием
Старый 29.04.2010, 23:20   #4
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Код:
#include <iostream>
#include <fstream>

bool isDigit( const char ch ){
    char digits[] = "0123456789";
    for( int i = 0; i < 10; ++i )
	if( ch == digits[i] )
	    return 1;
    return 0;
}

int charToInt( const char ch ){
    if( isDigit( ch ) ){
	char digits[] = "0123456789";
	for( int i = 0; i < 10; ++i )
	    if( ch == digits[i] )
		return i;
    }
    return -1;
}

int stringToInt( const std::string &str ){
    int result = 0;
    for( int i = 0; isDigit( str[i] ) && i < str.length(); ++i )
	result = result * 10 + charToInt( str[i] );
    std::cout << result << '\n';
    return result;
}

int main(){
    std::string fileName;
    std::cin >> fileName;
    std::ifstream in( fileName.c_str() );
    int sum = 0;
    std::string digit;
    char tmp;
    while( !in.eof() ){
	in.get(tmp);
	if( isDigit( tmp ) )
	    digit += tmp;
	else
	    if( !digit.empty() ){
		sum += stringToInt( digit );
		digit.clear();
	    }
    }
    std::cout << sum << std::endl;
}
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 30.04.2010, 00:02   #5
ozo
Форумчанин
 
Аватар для ozo
 
Регистрация: 26.04.2010
Сообщений: 328
По умолчанию

Код:
cin >> tmp;
delete [] tmp;
hFile = fopen(tmp, "rt");
Ну что за порно ? А вдруг кто-то внезапно заховает память, куда ссылается tmp ?
Используй гугль, будь счастлив
hackme@yandex.ru
Блог об archlinux
ozo вне форума Ответить с цитированием
Старый 30.04.2010, 01:18   #6
nerdo
Новичок
Джуниор
 
Регистрация: 29.04.2010
Сообщений: 4
По умолчанию

ozo
Порно то еще)))
Спасибо за помощь, код очень полезный, я сам пытался разобраться с fstream, только мозг себе поломал))
nerdo вне форума Ответить с цитированием
Старый 30.04.2010, 02:37   #7
nerdo
Новичок
Джуниор
 
Регистрация: 29.04.2010
Сообщений: 4
По умолчанию

ozo
Возник вопрос, а как мне все данные из result, вставить в программу что бы потоками его обрабатывать?
nerdo вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение файла PastoriXx C++ Builder 8 23.02.2012 08:13
Чтение файла lapo4ka1368 Общие вопросы C/C++ 0 07.04.2010 17:15
Чтение из файла DimOn4Ik PHP 1 02.01.2010 22:41
Чтение из файла... Bill Gates Общие вопросы Delphi 3 22.03.2008 22:13
чтение файла vicvtor Общие вопросы Delphi 4 27.11.2006 12:26