我正在尝试编写一个程序,该程序从文件中读取文本,将字符转换为大写,然后将输出写入新文件。该代码对于读取和转换为大写字母部分工作正常,但是在我为输出文件的名称创建char*
时写输出部分时,出现了段错误。
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
void lowerToUpper(char* temp)
{
char* name;
name = strtok(temp,":");
// Convert to upper case
char* s = name;
while (*s)
{
*s = toupper((unsigned char) *s);
s++;
}
}
int main()
{
int fd;
char* file_name_read = "./test.txt";
fd = open(file_name_read, O_RDONLY);
char* buf_rd;
ssize_t nr;
size_t byte_count = 1000;
off_t offset = 0;
nr = pread(fd, buf_rd, byte_count, offset);
close(fd);
lowerToUpper(buf_rd);
char* file_name_write = "./test_uppercase.txt";
/* CODE FOR WRITING TO THE FILE */
return 0;
}
当我删除char* file_name_write
行时,代码可以正常工作。当我将其包含在代码中时,会出现分段错误。
我尝试过
lowerToUpper()
内部main
的呼叫char file_name_write[]
代替char* file_name_write
malloc()
分配空间,然后分配其值byte_count
和offset
值 编辑:
问题是使用buf_rd
的未初始化指针。当我添加
char* buf_rd = (char*) malloc(1000 * sizeof(char));
它解决了这个问题。
谢谢李斯特先生和潜伏者!
答案 0 :(得分:3)
char* buf_rd;
...
nr = pread(fd, buf_rd, byte_count, offset);
您没有为buf_rd
分配内存。它只是一个指针。
答案 1 :(得分:1)
您使用buf_rd
作为缓冲区,但是该变量仅被声明且从未初始化。
ssize_t pread(int fd ,void * buf ,size_t < em> count ,off_t offset );
pread()从文件描述符 fd 偏移量读取最多 count 个字节 (从文件的开头) offset (偏移)从 buf 开始进入缓冲区。 文件偏移不会更改。
期望您初始化pread
函数可以使用的缓冲区。