gpt4 book ai didi

c - 从txt文件获取输入并添加到数组中

转载 作者:行者123 更新时间:2023-11-30 14:50:16 24 4
gpt4 key购买 nike

我是C语言新手。我想为我的代码创建一个数组来进行一些操作。正如我上面所说,我正在努力学习如何有效地使用 C 语言。我的问题是这样的:我有一个输入文件,比如说 input.txt。我知道每行有 4 个不同的东西,其中 2 个是字符串,2 个是数字。另外,我想创建一个二维数组。但我不知道输入文件中有多少行。这取决于用户。因此,我必须使用 ma​​lloc 来动态创建我的数组。那么,你能帮我解决这个问题吗?也许这很容易,但我认为用 C 语言读取文件和创建一些数组比其他语言更困难。在 Python 中这很容易:(我将我的代码留在下面。如果你告诉我我的错误,我会很高兴:)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char const *argv[]) {
char *arrChar;
int i;
char *str;
char *token;
arrChar = (char *) malloc( sizeof( char ) );
str = (char *) malloc( sizeof( char ) );
FILE *FileChars;
FileChars = fopen( argv[1], "r");
i = 0;
while ( fgets(str, sizeof str, FileChars) != NULL) {
int j;
for ( j = 0; j < 4; j++ ) {
token = strtok(str, ",");
arrChar[i][j] = token;
}
i++;
}
}

最佳答案

  1. 您需要准确理解 sizeof 的含义。运算符确实如此,它不返回动态分配的内存块的大小,它返回类型的大小,在数组的情况下 - 粗略地说 - 大小是类型规范的一部分,所以它返回数组占用的字节数。

    就您而言sizeof(char)是类型 char 的大小( C 标准) 要求其精确1

    sizeof(str)str 类型的大小这是 char * ,即指针的大小。可能是48取决于您当前的平台。

    要解决这个问题,您必须定义一个在整个程序中使用的长度作为已分配内存块的长度,在您确保分配成功后(见下文) .

  2. 指向 char 的指针可以指向一个元素序列,如果序列正确,则可以将其解释为字符串。一系列“可打印”字符,后跟 '\0'null 字符被视为字符串。

  3. 您必须通过NULLstrtok()第一次之后,如果您要处理相同的字符串。

  4. 您应该检查 fopen()通过将返回值与 NULL 进行比较,确实返回了有效的流.

  5. 与(5)相同,对于malloc()当无法分配时NULL返回并将其用作有效指针是未定义行为

综上所述,这就是您可能想写的内容

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NUM_WORDS 100

int main(int argc, char const *argv[])
{
char *token;
char **words;
char line[100];
char *ptr;
size_t count;
FILE *file;

file = fopen( argv[1], "r");
// Check that we DID open the file
if (file == NULL) {
perror(argv[1]);
return EXIT_FAILURE;
}

// Allocate space for `NUM_WORDS' pointers
words = malloc(NUM_WORDS * sizeof(*words));
// Check that we did allocate enough memory
if (words == NULL) {
fclose(file);
return EXIT_FAILURE;
}

// We use `sizeof' here because `line' is an array
count = 0;
while ((count < NUM_WORDS) && (fgets(line, sizeof(line), file) != NULL)) {
ptr = line;
do {
token = strtok(ptr, ",");
// We need to copy the `token' because
// it lies within `line' and the '\0' will
// be replaced by the original character
// in subsequent callse to `strtok()'
//
// The `strdup()' will allocate enough space with
// `malloc()' then copy the contents of `token' to the
// allocated buffer, and return it, so we will
// have to call `free()' on every `words' element.
words[count++] = strdup(token);
// Subsequent calls to `strtok()' with the same
// string require that the first parameter is
// NULL
ptr = NULL;
} while ((count < NUM_WORDS) && (token != NULL));
}
// Now we may print the words and free the memory
for (size_t index = 0; index < count; ++index) {
puts(words[index]);
free(words[index]);
}
free(words);
return 0;
}

请注意,上面的代码确保我们不会超出指针数组的容量 words 1。如果您需要调整它的大小,您将需要学习如何使用 realloc()并在专门的例程中执行此操作,这样您的代码就不会变得太复杂。

<小时/>

1请注意,分配的空间没有预定义的解释,我们确实将其解释为数组,但它不是 中的数组。数组定义的意义, line IS,具有 char 类型的元素, line 也可以解释为字符串,因为它的内容与上面 (2) 第二点中给出的定义兼容。

关于c - 从txt文件获取输入并添加到数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49087605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com