如何从c c ++中具有多个路径的字符串中提取文件路径?

时间:2013-02-18 12:55:01

标签: c++ c visual-studio-2010 visual-studio visual-c++

我正在使用Visual Studio 2010 C ++,我有一个包含多个这样的路径的长字符串。

C:\ eula0.txt

C:\ eula1.txt

C:\ eula2.txt

C:\ eula3.txt

C:\ eula4.txt

以上所有文件路径都在一个字符串“S”中。每条路径之间都有一个新的字符串“\ n”。我想将每个路径提取为单个字符串路径。

最终输出应该是这样的。

string s0 = C:\ eula0.txt

string s1 = C:\ eula1.txt

string s2 = C:\ eula2.txt

string s3 = C:\ eula3.txt

string s4 = C:\ eula4.txt

我该怎么做?请帮我。 感谢。

6 个答案:

答案 0 :(得分:2)

尝试getline

#include <string>
#include <sstream>

std::string S = /* your string */;
std::istringstream iss(S);

for (std::string line; std::getline(iss, line); )
{
    std::cout << "Have file: " << line << "\n";
}

答案 1 :(得分:2)

此示例将单个字符串复制到向量中,并将每个字符串打印到stdout。它依赖于istream_iterator使用\n作为分隔符的事实。请注意,它也会使用其他空白字符作为分隔符,因此如果您的文件名包含空格,它将无效。

#include <string>
#include <iostream>
#include <sstream>
#include <iterator>
#include <vector> 
int main()
{
  std::string s("C:\\eula0.txt\nC:\\eula1.txt\nC:\\eula2.txt");

  std::stringstream str(s);
  std::vector<std::string> v((std::istream_iterator<std::string>(str)),
                             (std::istream_iterator<std::string>()));

  for (const auto& i : v) 
    std::cout << i << "\n";
}

答案 2 :(得分:1)

使用std::string的{​​{1}}功能创建自己的自定义循环。这将是一种方式。还有很多其他方法。

答案 3 :(得分:1)

您可以将istringstreamgetline用于此

std::istringstream ss(S);
std::string s0, s1, s2, ...;
std::getline(ss, s0);
std::getline(ss, s1);
...

答案 4 :(得分:1)

另一种方式,或更多C方式:

char *tmp;
char *input = ...; // Pointer to your input, must be modifiable null terminated string
char *buffer[256]; // Pick appropriate size
int i=0;

while((tmp=strchr(input, '\n'))
{
    *tmp = 0;
    buffer[i++] = strdup(input);
    input = ++tmp;
    // We replaced the newlines with null-terminators,
    // you may now undo that if you want.
}
buffer[i] = strdup(input); // Last entry or if no newline is present

P.s不要忘记以后释放内存strdup为你分配并做一些健全检查:)

(告诉我你是否需要我告诉我们这里有什么,我会进一步解释。)

答案 5 :(得分:0)

我用这种方式写的。工作完美。

感谢所有人。

void GetFilePathFromMultipleStringPaths(const char* urls)
{
    int n = 0;
    vector<string> tokens; // Create vector to hold paths
    std::string s = urls;
    std::string::size_type prev_pos = 0, pos = 0;
    while( (pos = s.find('\n', pos)) != std::string::npos )
    {
        std::string substring( s.substr(prev_pos, pos-prev_pos) );
        tokens.push_back(substring);
        prev_pos = ++pos;
        n++;
    }
    std::string substring( s.substr(prev_pos, pos-prev_pos) ); // Last path
    if(substring.data() != NULL)
    {
        tokens.push_back(substring);
        n++;
    }
    for (int i=0; i<n; i++)
    {
        cout<<tokens[i].c_str()<<"  "<<i<<endl;
    }
}