2017-12-08 38 views
-5

voidに引数行を渡すにはどうすればよいですか?そのデータ型は引数をvoid関数に渡す

行[100] [260]

私は[] []

のwchar_t *ラインのような他の方法を試してみるべきであるショーのエラーを保ちます

まだできません

#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <windows.h> 

using namespace std; 

    void test(DWORD a, wchar_t * line[]) 
    { 

     unsigned int i; 

     for (i = 0; i < a; i++) 
     { 
      wcout << line[i]; 
     } 

    } 

    int main() 
    { 
     FILE *pFile; 
     wchar_t *file = L"d:\\a.txt"; 
     wchar_t line[100][MAX_PATH]; 
     unsigned int a = 0; 
     if (_wfopen_s(&pFile, file, L"r, ccs = UNICODE") == 0) 
     { 
      while (fgetws(line[a], 100, pFile)) 
      { 
       a++; 
      } 
     } 

     test(a, line); 

     return 0; 
    } 

ありがとう

+1

:ファイル、例えばを読むために代わりにCの機能のC++の機能C++の良い本がいくつかあります。 – IInspectable

+0

@Claudia:あなたの関数はポインタの1次元配列を必要としています。あなたは2次元の文字列を渡そうとしています。同じことではありません! –

+0

@IInspectableはwchar_tを渡す方法がありませんか?私はwchar_tが欲しい。 – Claudia

答えて

0

この関数は、NULLで終了する文字列へのポインタの1次元配列を必要としています。しかし、代わりに2次元配列のcharを渡そうとしています。彼らは同じものではありません!

非常に少なくとも、あなたは最初の配列、例えばの要素へのポインタが含まれている二番目の配列を作成することができます:あなたが使用しなければならない、とにかくC++を使用していることから、言われていること

#include "stdafx.h" 

#include <iostream> 
#include <fstream> 

#include <windows.h> 

void test(DWORD a, wchar_t * lines[]) 
{ 
    for (unsigned int i = 0; i < a; ++i) { 
     std::wcout << lines[i] << std::endl; 
    } 
} 

int main() 
{ 
    FILE *pFile; 
    wchar_t *file = L"d:\\a.txt"; 
    wchar_t lineData[100][MAX_PATH]; 
    wchar_t* lines[100]; 
    wchar_t *line; 

    unsigned int a = 0; 
    if (_wfopen_s(&pFile, file, L"r, ccs = UNICODE") == 0) 
    { 
     do 
     { 
      line = lineData[a]; 

      if (!fgetws(line, MAX_PATH, pFile)) 
       break; 

      size_t len = wcslen(line); 
      if ((len > 0) && (line[len-1] == L'\n')) 
       line[--len] = 0; 

      lines[a] = line; 
     } 
     while (++a < 100); 

     fclose(pFile); 
    } 

    test(a, lines); 

    return 0; 
} 

を`無効テスト(DWORD []、wchar_t型*ライン)` ``無効テスト(のconstのstd :: wstringの&ライン)とを交換し、取得

#include "stdafx.h" 
#include <windows.h> 

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 

void test(const std::vector<std::wstring> &lines) 
{ 
    for (std::wstring &line : lines) { 
     std::wcout << line << std::endl; 
    } 

    /* or: prior to C++11: 

    for (std::size_t i = 0; i < lines.size(); ++i) { 
     std::wcout << lines[i] << std::endl; 
    } 

    or: 

    for (std::vector<std::wstring>::iterator iter = lines.begin(); iter != lines.end(); ++iter) { 
     std::wcout << *iter << std::endl; 
    } 
    */ 
} 

int main() 
{ 
    std::vector<std::wstring> lines; 
    std::wstring line; 

    std::wifstream file(L"d:\\a.txt"); 
    if (file.is_open()) 
    { 
     while (std::getline(file, line)) { 
      lines.push_back(line); 
     } 
     file.close(); 
    } 

    test(lines); 

    return 0; 
} 
+2

それ、と範囲ベースのforループ。不必要な変数とバグの機会を節約します。 – IInspectable

+0

私はあなたの意見から頼むことができます。 CとC++の方法とは異なるパフォーマンスがありますか?すばらしいですか? – Claudia

+1

@Claudia:それはパフォーマンスに関するものではなく、安全かつ正確に「正しいこと」を行うことです。 CはC++ではありません。 C++を使用する場合は、使用する方法で使用してください。しかし、パフォーマンスが心配な場合は、コードをプロファイルして、ニーズに最適なものを確認してください。 –

関連する問題