|
Following to my question yesterday, is there anything that can be done to clean up the c code below which works fine but looks ugly especially the strcat's? The program parses a file containing a list of files and then runs a command on each. I can do a similar thing in perl like this a couple of lines but in C its looks ugly and I think its because I am a newbie...any comments will be appreciated....
thanks in advance for everyones help
In perl:
#!/usr/bin/perl
while(<>){
chomp;
$cmd="qsub -P 9999 -wd -e $_\.error -b y /usr/local/projects/bin/program -i $_ -type p -terms -lookup -o $_\.qsub";
print "$cmd\n";
}
in C:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
char * cwd = getcwd(0,0);
char pro[10000];
char str[1000];
char* nl;
if (argc < 3) {
printf("\n\nPlease supply a file containing a list of single file names follow by project code\n");
exit(5);
}
FILE *f;
f = fopen(argv[1], "r");
if(!f) {
printf("Couldn't open file.txtn");
return 1;
}
while(fgets(str, 1000, f)) {
nl = strrchr(str, '\r');
if (nl) *nl = '\0';
nl = strrchr(str, '\n');
if (nl) *nl = '\0';
strcpy(pro, "qsub -P ");
strcat(pro, argv[2]);
strcat(pro, " -wd -e ");
strcat(pro, cwd);
strcat(pro, "/");
strcat(pro, str);
strcat(pro, ".error -b y /usr/local/projects/bin/program -i ");
strcat(pro, cwd);
strcat(pro, "/");
strcat(pro, str);
strcat(pro, " -type p -terms -lookup -o ");
strcat(pro, str);
strcat(pro, ".qsub");
printf (pro);
system(pro);
}
}
|
|
|
|
|
Hi,
why don't you use sprintf() to compute the entire string?
it works similar to printf() but outputs to a char buffer.
FYI: More modern languages support string objects and do simple concatenation, much like ancient Basic: string c = a + b;
Luc Pattyn [Forum Guidelines] [My Articles]
- before you ask a question here, search CodeProject, then Google
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get
- use the code block button (PRE tags) to preserve formatting when showing multi-line code snippets
|
|
|
|
|
You should really use sprintf() instead of strcpy and strcat, it will look something like this:
sprintf(pro, "%s%s%s%s%c%s%s%s%c%s%s%s%s",
"qsub -P ",
argv[2],
" -wd -e ",
cwd, '/',
str,
".error -b y /usr/local/projects/bin/program -i ",
cwd,
'/',
str,
" -type p -terms -lookup -o ",
str,
".qsub");
after this call pro[] buffer contains formatted string
And few remarks about your code safety:
be careful with creating huge local buffers on the stuck - pro[] buffer in this case. It may happen that you get stuck overflow (application crush) It is better to create such buffers dynamically then you can check if allocation succeeded or just create static buffer
use sizeof(str) in fgets(str, sizeof(str), f) to avoid problems with writing outsie str[] memory area when str[] buffer size will be changed to smaller one
|
|
|
|
|
Thank you so much grzkas!
|
|
|
|
|
One little (possible) improvement to the original answer - the literal strings can be embedded in the sprintf format string, as shown below. It's a bit more like variable interpolation in strings, a la Perl.
sprintf(pro, "qsub -P %s -wd -e %s/%s.error -b y /usr/local/projects/bin/program -i %s/%s -type p -terms -lookup -o %s.qsub",
argv[2],
cwd,
str,
cwd,
str,
str);
Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p
|
|
|
|
|
Thanks Stuart, very useful..
|
|
|
|
|
hi all...as a part of my project...i need to send an mp3 file to another sys..i've created packet but i hv no idea abt how to place that mp3/pcm as payload..since the maximum size of ethernet frame payload is 1500 bytes, do i have to do sampling?..can anyone help me out with this??? thanks...
|
|
|
|
|
Can you explain how/why you are dealing with ethernet frames?
|
|
|
|
|
hi..actually what i've to do is to create a layer 2 (Datalink layer) protocol for streaming mp3/any audio file to another system in intranet(LAN)..for that i'm using winpcap for sending packets...how to place mp3 payload in that??
|
|
|
|
|
septane wrote: since the maximum size of ethernet frame payload is 1500 bytes
At the application layer you needn't worry about the ethernet payload.
The splitting will be done at lower layers.
«_Superman_»
I love work. It gives me something to do between weekends.
|
|
|
|
|
Hi.
I have a c# DLL, and I want to use it in a c/c++ project.
I'm using LoadLibrary() and GetProcAddress(). I have a problem when I want to use GetProcAddress() because, I don't know how to call the method that I want...
For example I know that the c# code has:
class myClass
public void myMethod1()
public void myMethod2()
and using the DLL I want to call 'myMethod2()'.
Anyone knows how can I do it?
Because if I do GetProcAddress(myDll,"myMethod2") it doesn't work (I call GetLastError() and it says that error is type 127)...
Thanks.
|
|
|
|
|
Member Ártemis wrote: ...(I call GetLastError() and it says that error is type 127)...
Which resolves to ERROR_PROC_NOT_FOUND . Have you used Dumpbin.exe or Depends.exe to see the names of the exported functions in the DLL?
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
No, I didn't...
But is it possible to use c# DLL in c/c++ projects, I ask this because I know that we can use c/c++ DLL in c#, but the otherwise I never tried?
I made the c# DLL myself, and I know the methods names. When compile the DLL methods names change?
Probably, these are stupid questions, but I'm trying to learn.
Thanks
|
|
|
|
|
Member Ártemis wrote: When compile the DLL methods names change?
Sometimes.
"Old age is like a bank account. You withdraw later in life what you have deposited along the way." - Unknown
"Fireproof doesn't mean the fire will never come. It means when the fire comes that you will be able to withstand it." - Michael Simmons
|
|
|
|
|
Member Ártemis wrote: i.
I have a c# DLL, and I want to use it in a c/c++ project.
I'm using LoadLibrary() and GetProcAddress(). I have a problem when I want to use GetProcAddress() because, I don't know how to call the method that I want...
Are you sure you can do that? I'm far from being an expert, but AFAIK managed DLLs contain IL code not executable one.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Are you saying that calling c# dll in c/c++ projects is not possible? Or that the method that I'm using is not the apropriate one?
I had used c/c++ dll's in c# projects, so I thougth that we can easy use c# dll in c/c++ projects.
If it is possible, please can you tell me one possible way to do it?
|
|
|
|
|
Member Ártemis wrote: Are you saying that calling c# dll in c/c++ projects is not possible?
Not directly. C# is managed code, C++ is native.
You can use C++/CLI to bridge the gap.
Mixed (Native and Managed) Assemblies[^]
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: You can use C++/CLI to bridge the gap.
Also, you can fish off of some bridges.
|
|
|
|
|
<big><O><
<O><
<O><</big>
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
|
My 5.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Member Ártemis wrote: Are you saying that calling c# dll in c/c++ projects is not possible?
It is possible, but not with LoadLibrary() and GetProcAddress(), like you do off with a native dll.
It is a crappy thing, but it's life -^ Carlo Pallini
|
|
|
|
|
You definitely can use a C# DLL in a C++ project.
But it is not as simple as exporting from the DLL and binding to it.
You have to create a COM Callable Wrapper (CCW) around your C# managed code.
Please check the documentation of how this is done.
Then you can access the DLL like a COM DLL.
«_Superman_»
I love work. It gives me something to do between weekends.
|
|
|
|
|
I think I'll end up my entire life trying to make a nodepad application. The wizard generated code & functionalities are totally misleading. wtf : Today should be my last attempt for this doc/view bullshit. Somebody please help.
Let me explain what are the things I've done.
1. Created a new SDI application.
2. Derived the view from CEditView . Found & replaced all CView with CEditView.
3. In the document class, added a CString member m_csText also a getter method to get this string.
4. Modified CMyDocument::Serialize() as ,
void CSDITest4Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
ar.Write(m_csText,m_csText.GetLength());
}
else
{
ar.Read(...read into m_csText...);
AfxMessageBox(m_csText);
UpdateAllViews(0);
}
}
5. In the View, added this code for OnUpdate:
void CSDITest4View::OnUpdate(CEditView* , LPARAM , CObject* )
{
CSDITest4Doc* pDoc = this->GetDocument();
CString cs = pDoc->getText();
CEdit& cText = GetEditCtrl();
cText.SetWindowTextW(cs);
}
As I read in every damn place, they say to "make use" of the standard code, without overriding anything or any modification on save file, open file etc.
Now my questions.
1. Why it doesn't show the string in the Edit window?The OnUpdate in view doesn't get called.
2. Why the next time I try to open the same file, it doesn't get into the ::Serialize read function? If I open some other document, it goes there. Otherwise, I need to close the app and open again. Why so?
3. Why it doesn't save anything?
4. From where the ::Serialize function is actually getting called? I want to see the internal MFC code.
5. If I want to debug, set through a "Open file" operation, what should I do? After it shows the File open dialog, it doesn't stop anywhere.
|
|
|
|
|
As you've started to do... Debug, debug, debug...
To answer in slightly random order, I put a break point in my program. If I load a recent file, then the code goes from CWinApp::OnOpenRecentFile to the function
CDocument* CWinApp::OpenDocumentFile(LPCTSTR lpszFileName) .
This function is also called from the file open command.
I suspect you are never calling the CDocument::SetModifiedFlag () method, so MFC is being all efficent and saying "nothing's changed - let's save effort".
That's (2), (3), (4) and (5) answered.
(1) You'll have to answer that with the debugger. But I can't see any CMyEditView::OnEnChange handler, to update the string in the document whenever you press a key and see a shiny new letter appearing in your edit document.
Iain.
Codeproject MVP for C++, I can't believe it's for my lounge posts...
|
|
|
|
|