2012-06-01 47 views
-1

我正在研究MediaPlayer项目,该项目将播放文本文件而不是音频或视频。我的问题是如何显示C字符串数组中的字符串?例如,如果在文本文件中我有(不带引号):将文本文件读入c字符串

**"This is only test"** 

和我的节目,我想在像一次显示一个字:

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; 
} 
+1

如果你已经标记了你的问题“C++”,你为什么要使用C函数和原始数组? –

+0

'人perror','人strerror'为有用的错误信息。 –

+1

您可能想要修改这个问题:它不是真的关于“如何将文本文件读入字符串”,而是更多“如何枚举字符串中的每个单词”。 – Mordachai

回答

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

+0

链接不起作用:(。为什么要从NULL分割“,.-”? – zangetsKid

+0

@EdwardFransindani - 正确的链接是http://www.cplusplus.com/reference/clibrary/cstring/strtok/。正如你从这个链接后面可以看到的,在第二次和随后调用'strtok'传递NULL告诉它继续解析给出的最后一个字符串。 –

+0

感谢您指出我的错误。更正了链接 – 2012-06-01 23:58:20

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代替char阵列,使用ifstream读取文件等

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; 
0

你的理由出现以下错误:

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

是该char使用不同的标志。您需要:

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

这只会在c字符串中打印字符。只需遍历数组即可访问剩余的字符。

+0

我应该使用2d数组,然后在数组中显示一个字符串?我不想一次显示一个字符,但一次只显示一个字.Thx – zangetsKid

0

这是一个简单的提示,

  • 带两个变量。用0初始化它们两个。
  • 开始遍历字符串。
  • 如果找到空格,请将其索引记录到第二个变量中。
  • 将第一个变量声明的内容复制到第二个变量中。
  • 使第一个变量=第二个变量。

继续执行上述步骤直到字符串结束。

相关问题