الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مساعدة في قراءة كود C++ مهم

بدأه 3ml في 23 ديسمبر 2009 · 5 رد · 1,064 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

لدينا مشروع مهم في قسم VB و هو تحويل أرقام منطوقة إلى كتابة

المهم نحن نسير ببطئ في المشروع و لكن سوف نستمر إلى غاية التوصل لحل إن شاء الله

هذا رابط الموضوع للإطلاع عليه

المهم هذا هو الكود الذي وجدناه ليقوم بتحويل أي ملف إلى ملف txt به الصيغة الثنائية Binary للملف الأصلي

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <assert.h>



int main(int argc, char** argv)

{

        char byte;

        size_t read;

        FILE* f ,*nf;

        int ret;

        int i;

        char header[44];

        unsigned long pos;

        if ( argc < 2 ) {

                fprintf(stderr, "Usage: %s FILENAME\n", argv[0]);

                return 1;

        }

        f = fopen(argv[1], "r");

        if ( !f ) {

                fprintf(stderr, "Can't open file %s.  Error: \n", argv

[1],strerror(errno));

                return 1;

        }

//اذا كنت ترديد عدم حفظ راس الملف( الهيدار) فعليك  جعل هذه الجزء يعمل  لان هذه الجزء يخزن راس الملف ملحق به

 البيانات

/*      if ( 44 != fread(header, 1, 44, f) ) {

                fprintf(stderr, "Failed reading header.  This may not be 

a .wavfile.\n");

                if ( fclose(f) == EOF )

                        fprintf(stderr, "Failed closing file.  Error: %

s\n",strerror(errno));

                return 1;

        } */

//          c    يخزن مباشرة على    VoiceBinaryfORMAT.txt  سو ف  يتم انشاء ملف اسمه 



if ((nf=fopen("c:\\VoiceBinaryfORMAT.txt","w"))==NULL)

{

printf("Can't open file");

return 1;

}

        do {

                errno = 0;

                read = fread(&byte, 1, 1, f);

                if ( read == 1 ) {

                        for ( i=8-1 ; i>=0 ; i-- )

                        {

  //         ان الناتج لان يطبع لان شاشة الاخراج فى السي لا تطبع اكثر من 398 سطر لذلك قد تعتقد ان الطباعة

 خطاء لذلك يتم التخزين فى ملف تكست  ومنه تتم الطباعة            

                                //printf("%d", ((byte >> i) & 0x1));

                                fprintf(nf,"%d",((byte >> i) & 0x1));

                                if (i==0)

                                {fprintf(nf,"\n");

                                printf("\n");

                                }

                                }

                }

        } while ( read == 1 );

        ret = 0;

        if ( ferror(f) ) {

                fprintf(stderr, "Error: %s\n", strerror(errno));

                ret = 1;

        }

        if ( fclose(f) == EOF ) {

                fprintf(stderr, "fclose error: %s\n", strerror(errno));

                ret = 1;

        }

        printf("\n");

        return ret;

}

ما نريده هو فقط من أين نمرر للبرنامج اسم الملف الذي نريد تحويله؟

لغة c++ تشبه ال c بعض الشيء لذلك فهمت بعض المقاطق من الكود لكن لم اتمكن من استعماله بفعالية

إذا كان هناك كود آخر لعمل هذا نرجوا إضافته

شكرا على المرور، وإن كانت لديك إجابة أو رد لا تبخل علينا بها،

نحن نرحب بكل مساعدة تأتي لصالح المشروع

شكرا

تم تعديل هذه المشاركة بواسطة 3ml في 23 ديسمبر 2009 في 15:58

بسم الله الذي لا يضر مع اسمه شيء في الأرض و لا في السماء و هو السميع العليم

117tpo4.png
#2

اسم الملف يمرر كما يبدو من خلال الParameters التى يمررها نظام التشغيل.

مثلا عندما تستدعى البرنامج استدعيه كذلك من الCommand Prompt :

progname.exe filename.txt

حيث progname هو اسم البرنامج يتبعه مسافة ثم اسم الملف الذى تريد تحويله.

1
#3
فادى_سى_بلس_بلس كتب:

اسم الملف يمرر كما يبدو من خلال الParameters التى يمررها نظام التشغيل.مثلا عندما تستدعى البرنامج استدعيه كذلك من الCommand Prompt :progname.exe filename.txtحيث progname هو اسم البرنامج يتبعه مسافة ثم اسم الملف الذى تريد تحويله.

السلام عليكم

شكرا أخي على التجاوب،

لكن هل يمكن تعديل الكود لجعل تمرير الملف يتم بطريقة عادية

أي يصبح في الكود متغير نضع له قيمة بمسار الملف مثل:

char *pth;
*pth = "/home/user/desktop/myFile.mp3";

و داخل الكود الأول نضع المتغير *pth بدل إسم الملف

هذه مجرد محاولة أنا لا أعرف C++ و لا C أرجوا التصحيح إن كنت مخطئا

شكرا

بسم الله الذي لا يضر مع اسمه شيء في الأرض و لا في السماء و هو السميع العليم

117tpo4.png
#4

السلام عليكم ...

أخي, المشرع الذي تحاول القيام به, أو بمعنى أصح فهم طريقة عمله, مشروع معقد جداً, ربما يحتاج إلى تمويل ضخم جداً و مبرمجين على مستوى عالي من الخبرة,

الكود الذي قمت بوضعه, عبارة عن C Code, يقوم بقراءة ملف من نوع wav, ثم يقوم بعمل text dump للـ data المكونة له بعد تخطي الـ header الخاص بالملف,

عموماً, قمت بكتابة كود بـ ++C لتنفيذ نفس المهمة, الكود يحتوي على اسم الملف المراد تحويله كما طلبت, بدلاً من ادخاله من سطر الأوامر كما في الكود الذي وضعته أنت:

/*
This program is a C++ implementation of the C code you have.
All what the original code does, is that it reads a binary 
sound file of type (.wav) and writes a textual representation of
the raw bytes of that file.

Enjoy :)


    the input file consists of the following parts:

	header: 44 bytes.
	sound:  the rest of the file.
*/

#include <iostream>
#include <fstream>
#include <string>
#include <exception>

std::streamsize fileSize( const char* filePath ){ ///////////////////////

	std::fstream::pos_type fsize = 0;
	std::ifstream file( filePath, std::ios::binary );

	fsize = file.tellg();
	file.seekg( 0, std::ios::end );
	fsize = file.tellg() - fsize;
	file.close();

	return fsize;
}

std::string byte_to_string(unsigned char byte)
{
	const size_t byteBits = 8;
	std::string byteString(byteBits, '0');

	byteString[0] = (byte & 1)    ? '1' : '0';
	byteString[1] = (byte & 2)    ? '1' : '0';
	byteString[2] = (byte & 4)    ? '1' : '0';
	byteString[3] = (byte & 8)    ? '1' : '0';
	byteString[4] = (byte & 16)   ? '1' : '0';
	byteString[5] = (byte & 32)   ? '1' : '0';
	byteString[6] = (byte & 64)   ? '1' : '0';
	byteString[7] = (byte & 128)  ? '1' : '0';

	return byteString;
}

int main()
{
	using namespace std;

	const string soundFileName  = "test.wav"; // input file
	const string outputFileName = "test.txt"; // output file
	const streamsize headerSize = 44;
	const streamsize inputFileDataSize = fileSize(soundFileName.c_str()) - headerSize;
	streamsize input_i = 0; // input file data pointer
	ifstream inputFile(soundFileName.c_str(), ios::binary);
	ofstream outputFile(outputFileName.c_str(), ios::trunc);
	unsigned char byte;

	// Discard the header, because we are interested in converting
	// the raw bytes of the sound file only.
	inputFile.seekg(headerSize, ios::beg);

	while( input_i++ < inputFileDataSize )
	{
		inputFile.read(reinterpret_cast<char*>(&byte), sizeof(byte));
		outputFile << byte_to_string(byte);
	}
}

اسم الملف من النوع wav يتم حفظه في السطر التالي:

const string soundFileName  = "test.wav"; // input file

و اسم الملف الناتج:

const string outputFileName = "test.txt"; // output file

لا تنسى, هذا الكود لا علاقة له من قريب و لا من بعيد بما تحاول فعله,

و أخيراً, الشخص الذي قام بكتابة الكود الأصلي شخص جيد في برمجة الـ C رغم أن لديه بعض الأخطاء البسيطة في الكود :)

تحياتي,

تم تعديل هذه المشاركة بواسطة Khaled.Alshaya في 24 ديسمبر 2009 في 23:07

1
#5

السلام عليكم

شكرا أخي Khaled.Alshaya على الكود و على كتابته بنفسك

سأجرب الكود في الـ Compiler لأرى إن كان يعمل كما نريد

شكرا جزيلا على الكود مهما كانت النتيجة

بالنسبة لموضوع صعوبة المشروع، فنحن على علم بأن الأمور ليست سهلة و لكن هذا لا يمنعنا من المحاولة و في حالة الفشل سنقوم بإعادة المحاولة وإذا فشلنا مجددا فسنحاول من جديد........هذه هي الخطة

نحن لدينا فكرة و هي مجرد المقارنة بين الصيغة الثنائية لملف mp3 أو wav لنطق رقم مع الصيغة الثنائية لكلام شخص في المايك

هذا ما سنجرب فعله إن شاء الله

شكرا

بسم الله الذي لا يضر مع اسمه شيء في الأرض و لا في السماء و هو السميع العليم

117tpo4.png
#6

لقد قمت بالتجربة و الكود يعمل 100% و الحمد لله

:) شكرا جزيلا أخي الكريم :)

قمت بتجربة ملف mp3 بحجم 5,6MB والنتيجة كانت ملف txt بحجم 40,2MB وهذا أمر طبيعي

للأسف لم أتمكن من فتحه لأنه كبير جدا على البرنامج الذي أستعمله ولكني تأكدت بأن داخله أصفار و آحاد وهذا هو المطلوب

الخطوة التالية ستكون إختصار الملف لنتمكن من رؤيته أصفار و آحاد بحجم صغير حتى تكون المقارنة سهلة

شكرا جزيلا

نحن سنكمل البقية في قسم VB إن شاء الله

لكل من يريد المساهمة "مرحبا" :)

شكرا

بسم الله الذي لا يضر مع اسمه شيء في الأرض و لا في السماء و هو السميع العليم

117tpo4.png

مواضيع مشابهة