从文本文件(C)读取时字符串长度发生变化

时间:2013-12-11 19:05:26

标签: c text-files string-length

我的问题看起来像这样: 我做一个char数组,让我们说它的长度是A,然后我把这个数组写入文件,然后从同一个文件中读取它,它的长度不再是A,它更大.. 源代码:

char encrypted1[] = "abcdefghijklmnopqrstuvqwxyz";
int encrypted1_len;
char *encrypted;
int encrypted_len;
encrypted1_len = strlen((char*)encrypted1);

f_cypher = fopen(CYPHER_FILE, "w");
fprintf(f_cypher, "%s", encrypted1);
fclose(f_cypher);

stat(CYPHER_FILE, &st);
size = st.st_size;
encrypted = malloc(size * sizeof *encrypted);
f_cypher = fopen(CYPHER_FILE, "r");
len = fread(encrypted, 1, size, f_cypher);
encrypted1[len] = '\0';
fclose(f_cypher);

encrypted_len = strlen((char*) encrypted);
printf("%s", encrypted);

在这个例子中,长度是27,然后是40。

3 个答案:

答案 0 :(得分:1)

您没有为回读的字符串分配足够的空间。你的encrypted1有26个字符和一个\ 0字符串结束标记,这就是27.现在你把这26个字节写入文件(执行ls -l - 检查26),分配26个字节,并将encrypted1 [len]设置为' \ 0',这是你没有分配的内存。从现在开始,任何奇怪的事情都可能发生。将malloc中的size更改为(size+1),看看会发生什么。

答案 1 :(得分:1)

问题是C字符串应该是null terminated,但你最后没有写出空字符。

一种解决方案是在将其写入文件时添加空字符(这使得无需显式写入大小):

encrypted1_len = strlen(encrypted1) + 1;

或者,当您从文件中读回时,可以添加空字符:

encrypted = malloc(size * sizeof *encrypted + 1);
encrypted[size] = '\0';

答案 2 :(得分:0)

试试我的朋友:

char encrypted[] = "abcdefghijklmnopqrstuvqwxyz"; /*27 characters */
f_cypher = fopen(CYPHER_FILE, "w");
fprintf(f_cypher, "%s", encrypted); /* could use fputs() instead */
fclose(f_cypher);

int source_length = sizeof(encrypted); /* could use strlen(encrypted) instead */
char buffer[source_length+1];  /* extra character for null terminator */
f_cypher = fopen(CYPHER_FILE, "r");
int len = fread(buffer, 1, source_length, f_cypher);
buffer[len] = '\0';
printf("%s\n",buffer);

printf("encrypted is %u characters long.\n", strlen(encrypted));
printf("buffer is %u characters long.\n", strlen(buffer));

使用encryptedencrypted1进行写入和阅读必然会造成混淆,因此我已将目标变量更改为buffer