-1

オーディオやビデオの代わりにテキストファイルを再生するMediaPlayerプロジェクトに取り組んでいます。私の質問は、C文字列配列に文字列を表示するにはどうすればよいですか?たとえば、テキストファイルに(引用符なしで)ある場合:

**"This is only test"**

私のプログラムでは、次のように一度に1単語ずつ表示したいと思います。

This
is
only
test

それ、どうやったら出来るの?これまでの私のコードは次のとおりです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//Global variables
int position=0; //to set the player position
float rate = 1.0; //the rate of playback

void LoadFile(const char *fileName, char *text){
    FILE *ifp; //a file pointer for file read/write

    //opening the file
    ifp = fopen(fileName, "r");
    if(ifp == NULL){
            fprintf(stderr, "Can't open input file \"%s\"!\n",fileName);
            exit(1);
    }
    else{
            fgets(text,50,ifp); //getting the text from the file
    }
    //closing the file  
    fclose(ifp); 
}

void *Start();
void *Stop();
void Rewind();
void SeekTo(int byteOffset);
void setRate(float rate);

int main(void){
    int i = 0;
    char choice;
    char fileName[25];
    char lineOfText[50];    //holds the text inside the file
    printf("Please enter the file you want to open: ");
    scanf("%s", fileName);
    LoadFile(fileName,lineOfText);
    printf("%s",lineOfText);   //I will display the whole string

    return 0;
}
4

5 に答える 5

1

C ++を使用しているので、Boostを使用して簡単に行うことができます。ファイルから行を読み取ったら、を作成してstringから使用できboost::splitます。

string line(text);
vector<string> words;
split(words, line, is_any_of(" "));

その後vector、ファイルから読み取った個々の単語を取得することを繰り返すことができます。たとえば、すべての単語を順番に印刷する場合(C ++ 11構文を使用):

for (const auto& w : words)
    cout << w << endl;

さらに、プログラムを実際のC++に移植することも検討してください。そのためには、配列stringの代わりに使用する必要があります。ファイルの読み取りなどに使用します。charifstream

于 2012-06-01T19:44:51.267 に答える
1

strtok関数を使用する

#include < stdio.h >

#include < string.h >

int main ()
{
  char str[] ="- This, a sample string.";
  char * pch;
  //printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str," ,.-");
  while (pch != NULL)
  {
    printf ("%s\n",pch);
    pch = strtok (NULL, " ,.-");
  }
  return 0;
}

このコードは出力を提供します

This
a
sample
string

さらに理解するには、以下に進んでください

http://www.cplusplus.com/reference/clibrary/cstring/strtok

于 2012-06-01T19:59:43.193 に答える
0

おそらく車輪の再発明ですが、場合によっては非常に便利です。

// substring_container_adapter.h
//
// substring_container_adapter is useful for treating a single master string as a collection of substrings
// for the purpose of enumerating over those substrings (read-only)
//
// NOTES:
//  (1) sequential forward access is reasonably efficient, but random access is definitely not very efficient.  (bidirectional could be implemented)
//  (2) the strings must be valid for the lifetime of the adapter and any enumerators you obtain from the adapter
//  (3) uses a greedy algorithm - so whole sequences of delimiters are considered one separator, rather than multiple separators

namespace details 
{
    template <typename charT>
    class substring_container_adapter
    {
    public:
        struct iterator : public std::iterator<std::forward_iterator_tag, const charT *>
        {
            // iterator constructor
            iterator(const charT * pszPosition, const charT * pszDelimeters)
                : m_pszPosition(pszPosition)
                , m_pszDelimeters(pszDelimeters)
                , m_pszEnd(FindOneOfOrNil(pszPosition, pszDelimeters))
            { }

            // supported relational operators
            bool operator == (const iterator & rhs) const { return m_pszPosition == rhs.m_pszPosition; }
            bool operator != (const iterator & rhs) const { return m_pszPosition != rhs.m_pszPosition; }
            bool operator <  (const iterator & rhs) const { return m_pszPosition < rhs.m_pszPosition; }

            // increment to next substring
            iterator & operator ++ ()
            {
                const charT * pszNext = SkipDelimeters(m_pszEnd, m_pszDelimeters);
                if (pszNext)
                {
                    m_pszPosition = pszNext;
                    m_pszEnd = FindOneOfOrNil(m_pszPosition, m_pszDelimeters);
                }
                else
                {
                    m_pszPosition += GetLength(m_pszPosition);
                }

                return *this;
            }

            // postfix increment
            const iterator operator ++ (int)
            {
                // note: the const return type flags misuse patterns (see More Effective C++, Item 6)
                iterator old(*this);
                ++(*this);
                return old;
            }

            // dereference == CString
            CString operator * () const { return CString(m_pszPosition, static_cast<int>(m_pszEnd - m_pszPosition)); }

            // iterators on our characters
            const charT * begin() const { return m_pszPosition; }
            const charT * end() const { return m_pszEnd; }

        private:

            const charT *   m_pszPosition;
            const charT *   m_pszDelimeters;
            const charT *   m_pszEnd;
        };

        typedef iterator const_iterator;

    public:
        substring_container_adapter(const charT * pszString, const charT * pszDelimeters)
            : m_pszString(pszString)
            , m_pszDelimiters(pszDelimeters)
            , m_end(pszString + GetLength(pszString), m_pszDelimiters)
          { }

          // iterators
          iterator begin() const { return iterator(m_pszString, m_pszDelimiters); };
          iterator end()  const { return m_end; };

    private:
        const charT *   m_pszString;        // zero-terminated character array
        const charT *   m_pszDelimiters;    // delimiters
        const iterator  m_end;              // end delimiter
    };

}

typedef details::substring_container_adapter<TCHAR> substring_container_adapter;
于 2012-06-01T19:50:49.373 に答える
0

エラーが発生する理由:

printf("%s",lineOfText[0]);

charが別のフラグを使用しているということです。必要なもの:

printf("%c",lineOfText[0]);

これは、c文字列に文字を出力するだけです。配列を繰り返し処理して、残りの文字にアクセスします。

于 2012-06-01T19:51:53.513 に答える
0

ここに簡単なヒントがあります、

  • 2つの変数を取ります。両方を0で初期化します。
  • 文字列のトラバースを開始します。
  • スペースを見つけたら、そのインデックスを2番目の変数に書き留めます。
  • 宣言された最初の変数から2番目の変数に内容を文字列にコピーします。
  • 最初の変数=2番目の変数にします。

文字列が終了するまで、上記の手順を繰り返します。

于 2012-06-01T22:58:23.347 に答える