我正在尝试编写一个函数,该函数使用fgets()将文件中的字符串读取为字符串数组,但是我在运行时始终得到std::vector<int> numbers;
int temp = 0;
while (std::cin >> temp) {
numbers.push_back(temp);
}
。
这是我的代码:
zsh: segmentation fault
我该如何解决?
答案 0 :(得分:0)
您的代码几乎正确。
错误:
在read
函数items++
中,错误的是,这会增加 pointer ,但是您想增加指针所指向的变量,因此需要{{ 1}}。
取决于平台(*items)++
将与posix read
函数冲突。
程序在以下情况下将失败:
如果文件read
不存在,则strings.dat
将是in
,并且对NULL NULL
指针进行文件操作将导致未定义的行为,通常表现为出现段故障。这可能是您发生的事情。
如果文件包含50行以上,则您将溢出FILE
,这也会导致行为未定义
如果文件中的行超过31个字符,则行将被截断和/或分割。
奖金:
不需要temp变量,您可以直接读入数组:
代替此:
strarr
您可以拥有:
char temp[31];
while (fgets(temp, len, in) != NULL) {
strcpy(arr[i], temp);
...
带有更正的最终代码:
while (fgets(arr[i], len, in) != NULL) {
...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void read(FILE*, char[][31], int*, int);
void printAll(char[][31], int*);
int main(int argc, char** argv) {
FILE* in = fopen("strings.dat", "r");
if (in == NULL)
{
printf("file does not exist\n");
exit(1);
}
char strarr[50][31];
int items = 0;
read(in, strarr, &items, 31);
printAll(strarr, &items);
}
void read(FILE* in, char arr[][31], int* items, int len) {
int i = 0;
while (fgets(arr[i], len, in) != NULL) {
i++;
(*items)++;
}
}
void printAll(char arr[][31], int* items) {
for (int i = 0; i < *items; i++) {
printf("String %d: %s\n", i + 1, arr[i]);
}
}
的替代版本
read
更短:
void read(FILE* in, char arr[][31], int* items, int len) {
int i = 0;
while (fgets(arr[i++], len, in) != NULL) {
(*items)++;
}
}