teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

8

文言修正

2020/10/01 17:30

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -67,7 +67,7 @@
67
67
 
68
68
  ---
69
69
  `students.csv`が14行にも関わらず`noOfRecords()`では`15`が返り、
70
- 15行目を読もうとして`Error: incorrect number of records read; the data is possibly corrupted`が出力されているのでしょう。
70
+ 15行目を読もうとして上記Valgrindのメッセージと`Error: incorrect number of records read; the data is possibly corrupted`が出力されているのでしょう。
71
71
 
72
72
  ```diff
73
73
  int noOfRecords() {

7

コード追記

2020/10/01 17:30

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -66,5 +66,18 @@
66
66
  ```
67
67
 
68
68
  ---
69
- おそらく`students.csv`が14行にも関わらず`noOfRecords()`では`15`が返り、
69
+ `students.csv`が14行にも関わらず`noOfRecords()`では`15`が返り、
70
- 15行目を読もうとして`Error: incorrect number of records read; the data is possibly corrupted`が出力されているのでしょう。
70
+ 15行目を読もうとして`Error: incorrect number of records read; the data is possibly corrupted`が出力されているのでしょう。
71
+
72
+ ```diff
73
+ int noOfRecords() {
74
+ int noOfRecs = 0;
75
+ char ch;
76
+ while (fscanf(fptr, "%c", &ch) == 1) {
77
+ noOfRecs += (ch == '\n');
78
+ }
79
+ rewind(fptr);
80
+ - return noOfRecs + 1; // 最終行用に +1
81
+ + return noOfRecs;
82
+ }
83
+ ```

6

指摘追加

2020/10/01 16:50

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -63,4 +63,8 @@
63
63
  name[i] = '\0'; // 文字列の配列を終了する
64
64
  return res;
65
65
  }
66
- ```
66
+ ```
67
+
68
+ ---
69
+ おそらく`students.csv`が14行にも関わらず`noOfRecords()`では`15`が返り、
70
+ 15行目を読もうとして`Error: incorrect number of records read; the data is possibly corrupted`が出力されているのでしょう。

5

文言修正

2020/10/01 16:43

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  > Conditional jump or move depends on uninitialised value(s)
34
34
 
35
- ファイルを読めておらず未初期化の変数`names`を`while`の条件に使用して怒られています。
35
+ ファイルを正しく読めておらず未初期化の変数`names`を`while`の条件に使用して怒られています。
36
36
  以下を直せば今指摘されているValgrindのエラーは消えます。
37
37
 
38
38
  ```diff

4

指摘追加

2020/10/01 16:29

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -26,4 +26,41 @@
26
26
  if (i != noOfStudents){
27
27
  cout << "Error: incorrect number of records read; the data is possibly corrupted" << endl;
28
28
  }
29
+ ```
30
+
31
+ ---
32
+
33
+ > Conditional jump or move depends on uninitialised value(s)
34
+
35
+ ファイルを読めておらず未初期化の変数`names`を`while`の条件に使用して怒られています。
36
+ 以下を直せば今指摘されているValgrindのエラーは消えます。
37
+
38
+ ```diff
39
+ struct Student {
40
+ char* m_name;
41
+ int m_studentNumber;
42
+ double m_gpa;
43
+ + Student() : m_name( nullptr){}
44
+ };
45
+
46
+ - Student* students;
47
+ + Student* students = nullptr;
48
+
49
+ bool readName(char name[]) { // データファイル内の学生名の読み取り
50
+ char names[256];
51
+ int gi = 0; //names index;
52
+ int i = 0;// name[i] index
53
+ - bool res = fscanf(fptr, "%[^,],", names);
54
+ + bool res = 1 == fscanf(fptr, "%[^,],", names);
55
+ if (res) { //csvを文字列の配列に拡散する
56
+ res = false;
57
+ while (names[gi]) {
58
+ name[i++] = names[gi++];
59
+ res = true;
60
+ }
61
+ }
62
+ name[i++] = '\0';
63
+ name[i] = '\0'; // 文字列の配列を終了する
64
+ return res;
65
+ }
29
66
  ```

3

指摘追加

2020/10/01 16:23

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -13,4 +13,17 @@
13
13
  }
14
14
  ```
15
15
  レコード数を読めたけれど、名前を読めなかった場合それ以降の要素の`m_name`は不定値なのでdeleteしてはまずいのでは?
16
- `Student`にコンストラクタをもたせるか、`students = new Student[noOfStudents];`の後で全要素`nullptr`で初期化するべき。
16
+ `Student`にコンストラクタをもたせるか、`students = new Student[noOfStudents];`の後で全要素`nullptr`で初期化するべき。
17
+
18
+ ---
19
+
20
+ > 画面内のエラーメッセージをGoogle翻訳してみましたが、全く意味がわかりません...
21
+ エラー:読み取られたレコードの数が正しくありません。 データが破損している可能性があります
22
+
23
+ あなたの書いたプログラムが出しているメッセージですが…
24
+ ```C++
25
+ // レコードの数が読み取り数と一致しない場合、エラーメッセージを出力
26
+ if (i != noOfStudents){
27
+ cout << "Error: incorrect number of records read; the data is possibly corrupted" << endl;
28
+ }
29
+ ```

2

誤記修正

2020/10/01 16:07

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -13,4 +13,4 @@
13
13
  }
14
14
  ```
15
15
  レコード数を読めたけれど、名前を読めなかった場合それ以降の要素の`m_name`は不定値なのでdeleteしてはまずいのでは?
16
- `Student`にコンストラクタをもたせるか、`students = new Student[noOfStudents];`の後で全要素`nullptr_t`で初期化するべき。
16
+ `Student`にコンストラクタをもたせるか、`students = new Student[noOfStudents];`の後で全要素`nullptr`で初期化するべき。

1

指摘追加

2020/10/01 15:58

投稿

SHOMI
SHOMI

スコア4079

answer CHANGED
@@ -3,4 +3,14 @@
3
3
  delete students; // students配列全体の割り当てを解除
4
4
  ```
5
5
 
6
- `delete[]`じゃないの?
6
+ `delete[]`じゃないの?
7
+
8
+ ---
9
+
10
+ ```C++
11
+ for (int i = 0; i < noOfStudents; i++) {
12
+ delete students[i].m_name;
13
+ }
14
+ ```
15
+ レコード数を読めたけれど、名前を読めなかった場合それ以降の要素の`m_name`は不定値なのでdeleteしてはまずいのでは?
16
+ `Student`にコンストラクタをもたせるか、`students = new Student[noOfStudents];`の後で全要素`nullptr_t`で初期化するべき。