0

行を読み取ってその内容を配列に格納するプログラムを作成しようとしているため、行ごとに読み取り、行内のさまざまな文字も読み取る必要があります。たとえば、私の入力は

4 6
0 1 4
0 2 4
2 3 5
3 4 5

最初の 2 文字で何かが決まるので、配列に 0 1 4 を書き、別の配列に 0 2 4 を書き込めるように、行を読み取る必要があります。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <list>
#include <iterator>

#define BUFFER_SIZE 50

int main()
{       
using namespace std;

int studentCount, courseCount;
FILE *iPtr;
iPtr = fopen("input.txt", "r");
if(iPtr == NULL){ printf("Input file cannot be opened!\n"); return 0; }

fseek(iPtr, 0, SEEK_SET);
fscanf(iPtr, "%d", &studentCount);
fscanf(iPtr, "%d", &courseCount);

list <int> S[studentCount]; // an array of linked lists which will store the courses
char buffer[BUFFER_SIZE];
char temp[BUFFER_SIZE];
int data;
int x=0, counter=0; // x traces the buffer

fgets(buffer, BUFFER_SIZE, iPtr);
while( buffer[x] != '\0')
{
   if( isspace(buffer[x]) ) counter++;
   x++;
}
printf("%d\n", counter);

fflush(stdin);
getchar();
fclose(iPtr);
return 0;
}

buffer[x​​] の値をデバッグして追跡すると、x=0 の場合は値が常に「10 \n」になり、x=1 の場合は「0 \0」になることがわかります。どうすればこれを修正できますか、または行ごとに読むためのより良い方法はありますか? 1 行のデータ数も必要なので、fgets や getline を使用するだけでは十分ではありません。

4

1 に答える 1

0

たとえそれが機能したとしても、C からの FILE* ベースの I/O と C++ を混在させるのは一般的に悪い考えです。ストレート C99 を実行するか、ストレート C++11 を実行しますが、両方ではありません。

これはC++の答えです:

#include <fstream>
...
std::ifstream infile("thefile.txt");
int ha,hb;
infile >> ha >> hb;
// do whatever you need to do with the first two numbers
int a, b, c;
while (infile >> a >> b >> c)
{
    // process (a,b,c) read from file
}

これはCの答えです:

fp = fopen("thefile.txt","r");
// do whatever you need to do with the first two numbers
fscanf("%d %d",&ha,&hb);
int a, b, c;
while(fscanf(fp,"%d %d %d",&a,&b,&c)==3){
        // process (a,b,c) read from file
}
于 2013-05-22T20:33:34.010 に答える