1

私のコードは、テキストファイルを開き、行数をカウントし、すべての行を格納する配列を割り当ててから、この配列を各行で埋める関数を呼び出します。この関数file.getline呼び出しは、空の文字列を返します。

コードは次のとおりです。

typedef char* line;

..。

char* filename=new char[256];
cout << "Type a file name: " << endl;
cin.ignore();
cin.getline(filename,255);

ifstream iFile(filename);

int nLines=CountLines(iFile);

line* LineArray = new line[nLines];
ReadLines(LineArray,iFile);

CountLines関数:

int CountLines(ifstream &file)
{
line templine=new char[64];
int nLines=0;

while (!file.eof())
{
    file.getline(templine,64);

    if (*templine != '\n')
        nLines++;

}
delete [] templine;

return nLines;
}

これは正しく機能します。ただし、ReadLinesは次のことを行いません。

void ReadLines(line* LineArray, ifstream &file)
{
    line templine=new char[64];

file.seekg(0,ios::beg);

int i = 0;
while (!file.eof())
{

    if (*templine != '\n')
    {
        LineArray[i]=templine;
        i++;
    }

}
delete [] templine;
}

getlineの「\n」の問題と関係があるように感じますが、getポインタを0に設定すると、ファイルが行ではなく通常のテキストで始まるため、templineがでいっぱいになる理由がわかりません。空の文字列。

4

3 に答える 3

6

最初に行を数えてから行を読み取る必要はありません。できるよ

#include <istream>
#include <vector>
#include <string>

std::vector<std::string> ReadLines(std::istream& is) {
    std::vector<std::string> lines;
    std::string line;

    while (std::getline(is, line)) {
        lines.push_back(line);
    }

    return lines;
}

これは、大騒ぎや手動のメモリ管理なしで、すべての行を含むstd::vectorを返します。

于 2012-11-30T12:44:09.977 に答える
1

コードにバグが多すぎます。

  • のパラメータistream::getline()が間違っています
  • 後に明確なeofフラグが必要ですCountLines()
  • 間違ったメモリフリー操作。
  • 何とか何とか..。

ポインターはおもちゃではありません。TinoDidriksenのソリューションを使用することをお勧めします。

charとpointersが本当に好きな場合は、次のようになります。

#include <iostream>
#include <fstream>
#include <cassert>

using namespace std;

int CountLines(ifstream &fin) {
  char templine[1024];      // no need for dynamic allocation.
  int count = 0;
  while (fin.getline(templine, 1024))
    count++;
  return count;
}

void ReadLines(char** lines, int count, ifstream &fin) {
  fin.seekg(0, ios::beg);
  for (int i = 0; i < count; i++) {
    lines[i] = new char[1024];      // you need dynamic allocation here.
    fin.getline(lines[i], 1024);
    assert(fin.gcount() < 1024);    // assure the line is shorter than 1023 chars
  }
}

int main() {

  char filename[256];         // no need for dynamic allocation.
  cin.getline(filename, 256); // second parameter should be the same size of your buffer.

  ifstream fin(filename);

  int count = CountLines(fin);
  char** lines = new char*[count];

  // After CountLines() called, fin.eof is set, you need to clear it.
  // Otherwise fin.getline() won't do a thing.
  fin.clear();
  ReadLines(lines, count, fin);

  // When every thing is done, you need to free all the memory.
  for (int i = 0; i < count; i++)
    delete[] lines[i];
  delete[] lines;

}
于 2012-11-30T13:23:48.770 に答える
-1

あなたの間違いはこのコードにあります:

if (*templine != '\n')

行の最初のシンボルをチェックしているからです。

次のようにコードを変更する必要があります。

int CountLines(ifstream &file)
{
    string line;
    int nLines=0;
    while(getline(file,line))
        nLines++;

    return nLines;
}


void ReadLines(string LineArray, ifstream &file)
{
    file.seekg(0,ios::beg);

    string line;
    while(getline(file,line))
    {
        LineArray += line;
    }
}
于 2012-11-30T12:36:33.320 に答える