C++版isspace函数(将C代码转换为C++代码)

5

我正在将代码从C转换为C++。我目前使用C函数 isspace,那么在使用ifstream时,C++等效的是什么?特别是while (!isspace(lineBuffer[l]))

id是第一个数字(2515, 1676, 279),name是第一个"space"之后的一组字母(ABC, XYZ, FOO)。

示例NewList.Txt

2515    ABC 23.5    32  -99 1875.7  1  
1676    XYZ 12.5    31  -97 530.82  2  
279  FOO 45.5    31  -96  530.8  3  

C 代码

void converter::updateNewList(){
    FILE* NewList;
    char lineBuffer[100];
    char* id = 0;
    char* name = 0;

    int l = 0;
    int n;

    NewList = fopen("NewList.txt","r");
    if (NewList == NULL){
        std::cerr << "Error in reading NewList.txt\n";
        exit(EXIT_FAILURE);
    } 

    while(!feof(NewList)){
        fgets (lineBuffer , 100 , NewList); // Read line    
        l = 0;
        while (!isspace(lineBuffer[l])){
            l = l + 1;
        }

        id = new char[l];
        switch (l){
            case 1: 
                n = sprintf (id, "%c", lineBuffer[0]);
                break;
            case 2:
                n = sprintf (id, "%c%c", lineBuffer[0], lineBuffer[1]);
                break;
            case 3:
                n = sprintf (id, "%c%c%c", lineBuffer[0], lineBuffer[1], lineBuffer[2]);        
                break;
            case 4:
                n = sprintf (id, "%c%c%c%c", lineBuffer[0], lineBuffer[1], lineBuffer[2],lineBuffer[3]);
                break;
            default:
                n = -1;
                break;
        }
        if (n < 0){
            std::cerr << "Error in processing ids from NewList.txt\n";
            exit(EXIT_FAILURE);
        }

        l = l + 1;
        int s = l;
        while (!isspace(lineBuffer[l])){
            l = l + 1;
        }
        name = new char[l-s];
        switch (l-s){
            case 2:
                n = sprintf (name, "%c%c", lineBuffer[s+0], lineBuffer[s+1]);
                break;
            case 3:
                n = sprintf (name, "%c%c%c", lineBuffer[s+0], lineBuffer[s+1], lineBuffer[s+2]);
                break;
            case 4:
                n = sprintf (name, "%c%c%c%c", lineBuffer[s+0], lineBuffer[s+1], lineBuffer[s+2],lineBuffer[s+3]);
                break;
            default:
                n = -1;
                break;
        }
        if (n < 0){
            std::cerr << "Error in processing short name from NewList.txt\n";
            exit(EXIT_FAILURE);
        }


        ids_.push_back ( std::string(id) );
        names_.push_back(std::string(name));
    }

    bool isFound = false;
    for (unsigned int i = 0; i < siteNames_.size(); i ++) {
        isFound = false;
        for (unsigned int j = 0; j < names_.size(); j ++) {
            if (siteNames_[i].compare(names_[j]) == 0){
                isFound = true;
            }
        }
    }

    fclose(NewList);
    delete [] id;
    delete [] name;
}

C++ 代码

void converter::updateNewList(){
    int l = 0;
    char c;

    std::ifstream radesNewList ("NewList.txt",std::ios::in|std::ios::ate);
    NewList.seekg(std::ios_base::beg);

    std::string line;
    while(!NewList.eof()){
        l = 0;
        getline(radesNewList,line);

        for (size_t i=0; i<line.length(); ++i){
            c=line[i];
            bool isWhiteSpace = std::isspace(c, std::locale("C")); 
            if (isWhiteSpace){
                l = i+1;
                break;
            }       
        }

        ids_.push_back (line.substr(0,l));

        int s = l;
        for (size_t i=l; i<line.length(); ++i){
            c=line[i];
            bool isWhiteSpace = std::isspace(c, std::locale("C")); 
            if (isWhiteSpace){
                l = i+1;
                break;
            }       
        }
        names_.push_back(line.substr(s,l-s));
        line.clear();
    }

    NewList.close();
}

你应该提供你正在转换的代码的示例。 - JoshD
2个回答

9

std::isspace() 是来自于 #include <locale> 的函数。(更完整的写法是 template <typename T> bool std::isspace(T c, const std::locale& loc)。在不同的编译器中,确切的声明可能会有所不同。)


1
使用方式与C的 isspace() 相同。适用于 const std::locale& 参数的正确值取决于您要执行的操作(例如,根据用户查找空格,或根据说希腊语的马其顿人查找空格,或根据ANSI查找空格等)。请说明您为何要查找空格,并跟随正确的 std::locale 传递参数。 - Jonathan Grynspan
1
@Jonathan:并不是你使用C的isspace函数的方式。对于C函数,如果要测试的值是一个char类型,你需要将其强制转换为无符号类型。对于C++模板,你可以直接传入一个char,并且该值可以是负数。 - Steve Jessop
1
编译器之间如何允许声明变化? - CB Bailey
我正在尝试找到字符之间的空白。我展示的 C++ 代码可以做到这一点,但根据 David Thornley 的说法,这与 isspace 不同。 - Elpezmuerto
2
那么这是机器可读/机器生成的输入?在这种情况下,您可能会期望输入格式良好 - 它不会有任何对普通C ++程序员未知的奇怪玻利维亚空格。您可能需要“C”语言环境,以避免任何实际本地化:bool isWhiteSpace = std::isspace(theCharacter, std::locale("C")); 当然,这个例子可以进一步优化,但是这是留给读者的练习。;) 请注意,“C”语言环境适用于空格,但可能不适用于字母、数字等。 - Jonathan Grynspan
显示剩余7条评论

3
我不知道C89标准库中有任何在C++中无法使用的内容。(对于C99来说就不一样了,它是在当前C++标准之后发布的,并包含了一些东西(例如complex),这些东西永远不能成为C++标准。) 通常情况下,只需包含C头文件,将.h后缀替换为c前缀(例如<ctype.h>变成<cctype><string.h>变成<cstring>),并记住大多数标识符(除了宏)需要一个std::前缀。特别地,包含<cctype>std::isspace(ch)在C++中的工作方式与在C中的工作方式相同。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接