为啥它只打印文本文件的一个单词而不是整个文本文件到 html 文件

Posted

技术标签:

【中文标题】为啥它只打印文本文件的一个单词而不是整个文本文件到 html 文件【英文标题】:Why is it only printing one word of the text file rather than the whole text file to a html file为什么它只打印文本文件的一个单词而不是整个文本文件到 html 文件 【发布时间】:2015-03-18 05:24:20 【问题描述】:

我目前正在开发一个使用命令行属性将 .txt 文件转换为 .xhtml 文件的项目。特别是,该程序将 ASCII 文本文件转换为 xhtml 1.0 文件,其中包含与原始 ASCII 文本文件相同的文本内容。我似乎遇到的问题是,当我打开 .html 文件以从旧的 .txt 文件中读取内容时,只有文件中的一个单词被读入 html 文件。谁能解释为什么会这样?非常感谢您的帮助。在此先感谢您。

//Programmer:
    //Date: March 9 2015
    //Purpose: converts an old style text file into any format
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <stdlib.h>
    #include <map>

    using namespace std;

    // getWord function to read in all words
    istream& getWord(istream& is, string& word)
    
        // find the beginning of the word (ie . eat all the non alphas)
        char ch;

        while (is.get(ch))
        

            if (isalpha(ch))
                break;
        
        // quit if no word found
        if (!is)
            return is;

        string buffer;
        buffer += ch;   // put the valid alpha onto the buffer
        while (is.get(ch))
        
            if (isalpha(ch))
                buffer += ch;
            else
                break;
        
        if (is)
            is.unget();
        if (is.eof())
            is.clear();
        if (is)
            //word = buffer;        // put the complete buffer into the word so it can be returned by reference. 
            //This does a copy + destroy!!
            swap(word, buffer);         // C++98(swap owner, then destory the old)
        word = std::move(buffer);   // C++ 11 
        return is;
    

    int main(int argc, char* argv[])

    
        ifstream infile(argv[1]);
        char ch = 0;
        while (infile.get(ch))
            cout.put(ch);
        

        // print out all the command line arguments
        for (size_t i = 0; i < argc; ++i)
        
            string s = (string)argv[i];
            cout << s << endl;
        
        //if input file is at location 1 in the command line
        string input = argv[1];
        for (size_t i = 0; i < input.size(); ++i)
        
            cout.put(input[i]);
        
        cout << endl;


    // Creating the html output file
        ofstream out("title.html");
        out << "<html xmlns=\"http://www.w3.org/1999//xhtml\"xml:lang=\"en\">" << endl;
        out << "<head>" << endl;
        out << "<meta http - equiv = \"Content-Type\" content = \"text/html; charset=UTF-8\" />" << endl;
        out << "<title>" << argv[1] << "</title>" << endl;
        out << "</head>" << endl;
        out << "<body>" << argv[1] << endl;

        // extracting the words from the file and storing it in a container
        typedef map<string, unsigned> dictionary_type;
        dictionary_type words;

        // read the information in to find only words
        string word;
        while (getWord(infile, word))
        
            auto loc = words.find(word);
            if (loc == words.end())
                words.insert(pair<string, int>(word, 1));
            else
                loc->second++;
        
        //print out the container
        for (auto w : words)
            cout << w.first << ": " << w.second << endl;
        out << "</body>" << endl << "</html>";



    

【问题讨论】:

你距离提出一个好问题只差三分之一,请发布一个小输入文件、预期输出以及你的程序实际输出的内容。 您的基本问题是您的代码甚至与您描述的内容并不相似。您的代码似乎是两个大部分不相关的部分的集合——一个生成 HTML 页眉/页脚。另一个尝试生成单词计数,例如您用来生成直方图的单词。然而,它们都没有做任何类似于将输入文件复制到输出的事情,并且在末尾添加了 HTML 页眉/页脚。它甚至没有暗示对内容进行您需要的 HTML 转义。 @user657267 我的程序实际上并没有吐出任何东西我正在使用命令行属性获取一个名为“The Republic by, Plato.txt”的 txt 文件并将其发送到一个 xhtml 文件到被阅读(所以当我点击它时我可以在浏览器中打开它)。我试图实现的代码应该读取(或尝试读取)txt 文件中的所有单词并将其复制到 xhtml 文件中。但它只给出了整个文本文件中的一个字。这就是为什么在我的代码中我调用 argv[1] 及其位置(或索引)。因为在命令行参数的位置 1,我将 txt 文件设置为该位置。 【参考方案1】:

我发现了几个问题:

    您首先读取文件的内容,并将内容回显到std::cout。完成后,文件中没有任何内容可读取。添加调用以倒回文件,然后再次读取其内容。

    infile.clear();  // Clear its state. Otherwise infile.eof() is true.
    infile.seekg(0); // rewind
    

这些行需要放在前面

    while (getWord(infile, word))

    你有这些台词:

    if (is)
       swap(word, buffer);         // C++98(swap owner, then destory the old)
    word = std::move(buffer);   // C++ 11 
    

    您只需要使用其中一个,而不是同时使用两者。如果您同时使用两者,word 将设置为空字符串。

【讨论】:

以上是关于为啥它只打印文本文件的一个单词而不是整个文本文件到 html 文件的主要内容,如果未能解决你的问题,请参考以下文章

Android如何在文本视图或任何东西中打印数组

将每个返回的字符串添加到文本文件中[重复]

从 x 到 y 秒播放音频

是否可以旋转单词的字符而不是使用 css3 旋转整个单词

我如何只打印出消息而不是整个文本[重复]

为什么这个用于着色文本的bash函数只打印整个字符串的第一个单词?