1

这是我从 .csv 文件中获取的代码,它让 itch 女巫在分隔符之间,并给出这些分隔符的位置。但这确实使它仅适用于第一行,例如如何继续第二行?

#include <tchar.h>
#include <stdio.h>
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
//#include <limits>
using namespace std;
#define TAILLE_MAX_LIGNE 1203
int _tmain(int argc, _TCHAR* argv[])
{
    char stringFile [TAILLE_MAX_LIGNE];
    string stringLineToAnalyse;
    size_t positionCharOld, positionCharNew;
    string separateurChar = ";";
    string contenuLocalChamp = "";
    vector <string> localStringVector;
    localStringVector.clear(); // Initialisation du vecteur  // VECTOR INTIALISE
    ifstream file;
    file.open("C:/Users/Alex/Desktop/STAGE/test.csv");
    if(file.is_open())
    {
        file.getline(stringFile, TAILLE_MAX_LIGNE);
        // file.ignore(numeric_limits<streamsize>max(),'\n'));
        stringLineToAnalyse = stringFile;
        cout << "tout va bien" << endl;
        cout <<  stringLineToAnalyse << endl;
        // initialisation de la recherche dans la ligne
        // INITIALISE SEARCH INTO THE LIGNE
        positionCharOld = 0;
        bool finDelaBoucle = false;
        while(finDelaBoucle == false)
        {
            // boucle itérative
            positionCharNew = stringLineToAnalyse.find(separateurChar, positionCharOld);
            if(positionCharNew != string::npos)
            {
                cout << "separateur trouve a la position " << positionCharNew << endl; // SEPARATOR POSITION
                if((positionCharNew-positionCharOld) > 0)
                {
                    contenuLocalChamp = stringLineToAnalyse.substr(positionCharOld, positionCharNew-positionCharOld);
                    cout << "le contenu de la string entre separateur est " << contenuLocalChamp << endl; // CONTENT BEATWEEN 2 SEPARATOR
                    localStringVector.push_back(contenuLocalChamp);
                }
                else
                {
                    cout << "ce champ vide" << endl;    // EMPTY FIELD
                }
                positionCharOld = positionCharNew+1;
            }
            else
            {
                finDelaBoucle = true;
                system("PAUSE");
                cout << "fin de la boucle" << endl; // END OF THE LOOP
                system("PAUSE");
            }
        }
    }
    else
    {
        cout << "pas de fichier" << endl;
        system("PAUSE");
    }
    return 0;
}
4

2 回答 2

4

整个示例与以下问题不太相关:如何逐行读取文件

std::string s;
while (std::getline(file, s))
{
    std::cout << s << "\n"; // each next line printed
}

请注意,使用std::getline它比干预安全得多char[]

while(std::getline(file, stringLineToAnalyse))
{

会在您的示例代码中找到重点

于 2012-10-31T16:06:36.053 回答
0

std::getline假设您尝试读取的文件格式或多或少正确,您很可能希望使用<string>. 请记住,这与调用类的成员函数getline不同std::basic_istream,后者对 char 数组进行操作。

这几乎可以归结为这样的事情 - 下面的代码用文件中找到的每一行填充向量:

#include <string>
#include <fstream>
#include <vector>

int main()
{
    std::ifstream myfile("/etc/passwd",std::ios::in);
    if(!myfile.good()) return 1;

    std::vector<std::string> myfile_lines;
    std::string single_line;

    while(std::getline(myfile,single_line))
    {
        myfile_lines.push_back(single_line);
    }

    myfile.close();
}
于 2012-10-31T16:16:35.367 回答