0

Stack Overflow に質問を投稿するのはこれが初めてです。私はプログラミングが初めてなので、変なことや間違ったことを言ったらすみません。以下のファイルで。ディレクトリを読み取り、変数 nAddress に保存します。次に、ファイル拡張子を削除します。ファイルを 700 行に分割し、それぞれが拡張子を再構築します。最後に、ファイル名を 1 文字 IE ずつ増やします: testA、testB、testC、testD など。

言い換え: 現在の出力:

テストは1400行なので出力

テストA

テストB

それはある必要があります:

テスト1

テスト2

正しい方向に私を向けることができますか?ありがとう!

string fAddress = argv[1];

if (argc > 2)
{
    for (int i = 2; i < argc; i++)
    {
        string temp = argv[i];
        fAddress = fAddress + " " + temp;
    }
}
cout << fAddress << "\n" <<endl;

// Convert to a char*
const size_t newsize = 500;
char nstring[newsize];
strcpy_s(nstring, fAddress.c_str());
strcat_s(nstring, "");


// Convert to a wchar_t*
size_t origsize = strlen(fAddress.c_str()) + 1;
size_t convertedChars = 0;
wchar_t wcstring[newsize];
mbstowcs_s(&convertedChars, wcstring, origsize, fAddress.c_str(), _TRUNCATE);
wcscat_s(wcstring, L"");


ifstream inFile;
inFile.open (wcstring);
int index = 0;

string parts[100];
string text;

for (int i = 0; i < 100; i++)
{
   parts[i] = "";

}

// get info until ; is found in each line and add it to the array of char*
while ( !inFile.eof( ) )
{
   getline(inFile, text, (char)1);
  if ( !inFile )
  {
      if (inFile.eof( ) )
         break;
      else
      {
         cout << "File error...\n";
         break;
         system("PAUSE");
     }
  }

    parts[index] += text;
    index++;
}
inFile.close();
int n = fAddress.length(); // Get the total size of the file name. 

string nAddress =     "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++";
cout<<"Removing previous file extension...\n";
n = n - 4; //Remove the extension from the output file
cout<<"Removed previous file extension successfully...\n\n";
cout<< "Building file location and name....\n";
for (int i = 0; i < n; i++)
{
   nAddress[i] = nstring[i]; //nstring hold the name

}
 cout<< "Built successfully....\n\n";
//Now nAddress is equal to the location and name of the file....



nAddress[n] = '0' ;//'A';

cout<<nAddress[n];

 // nAddress[n+1] = 1+48;
 //system("cls");
 cout<< "Building file extension...\n"<< endl;
 for (int i = n; i < n+4; i++) // n is whatever the length of the string is. Add 4 chars onto the n.
 {
   nAddress[i+1] = nstring[i];
   fileextension = fileextension + nstring[i]; //This saves off the full file extension for later use. :)

   //cout <<nAddress;   This seems to build the extension of the file... IE .T, .TA, .TAP

  }
  cout<< "File extension built successfully...\n"<< endl;
  nAddress[n+5] = '\0';
  //cout<< nAddress;
  string files[10];

//This is the part that searches through the file and splits it up I believe.
for (int i = 0; i < index-2; i++)
{
   files[i] = parts[0] + parts[i+1] + parts[index-1];
    //cout<< files[i]; //This line will output the entire file in the CMD window
}
//system("cls");
// The function below is where the names are dished out
nAddress[n-20];
int counter = 0;
int lastnum;
for (int i = 0; i < index-2; i++)
{
    //string myval;
    //ostringstream convert;
    //counter++;
    //convert << counter ;


    nAddress[n] = i + 65;   //this is the line that gives the letters... it comes in with an A as the first file FYI
    //nAddress = nAddress + convert.str();
    //cout<<convert.str();
    //cout<<counter;

    //myval = nAddress[n];
    //cout<<myval;


    cout<<"Outputting sub-files...\n" <<endl;
    cout<<nAddress<< "\n" << endl;

    size_t origsize = strlen(nAddress.c_str()) + 1;
    size_t convertedChars = 0;
    wchar_t wcstrings[newsize];
    mbstowcs_s(&convertedChars, wcstrings, origsize, nAddress.c_str(), _TRUNCATE);
    wcscat_s(wcstrings, L"");


    ofstream outFile (wcstrings);   
    outFile << files[i];
}
4

3 に答える 3

3

sth を使用します。このような:

std::string getPartFilename(int partNumber)
{
    std::ostringstream oss;

    oss << "Test" << partNumber;
    return oss.str();
}

更新 私の要点を明確にするために、コードをリファクタリングして、ファイル名を作成するための厄介な C 文字列操作 ( 、 など) をすべて削除しstrcpy_s()strcat_s()単純で直接的な C++ 標準メカニズムを使用して、必要に応じて文字列をフォーマットします。

于 2013-06-20T20:42:55.410 に答える
2

よし、だったら

nAddress[n] = i + 65; 

ファイルのインクリメントされた文字が設定される場所は、ここで私がすることよりも本当にです。

std:string を使用しているため、

// make your address just "test"
nAddress[n] = '\0';

// cast `i` to a string and concatinate
nAddress += to_string(i);

http://www.cplusplus.com/reference/string/to_string/
http://www.cplusplus.com/reference/string/string/operator+=/


std:string を使用していない場合は、次のようにアプローチします

// make your address just "test"
nAddress[n] = '\0';  

// make a character array that contains the character representation of `i`
char buffer[50];
sprintf("%d", i);

// concatinate
strcat(nAddress, buffer);

または、単に行うことができます

sprintf(&nAddress[n], "%d", i); 

個別に述べたように


于 2013-06-20T20:42:32.017 に答える